0

I have this data frame :

Var1 var 2 var3

var1   var2   var3
A      B        1
B      C        2
B      A        3
D      C        4
B      D        5

And I would like to transform it to a matrix And add a column and a row to sum the values associated to each variable like this using R code:

    A    B   C   D Total
A   0    1   0   0 1
B   3    0   2   5 10
C   0    0   0   0 0
D   0    0   4   0 4
T   3    1   6   5

Can you suggest me a way of doing it ?

Thanks a lot!!

gaga
  • 27
  • 4

1 Answers1

0
nms <- sort(unique(c(as.character(df$var1),as.character(df$var2))));
m <- matrix(vector(typeof(df$var3),1L),length(nms),length(nms),dimnames=list(nms,nms));
m[cbind(as.character(df$var1),as.character(df$var2))] <- df$var3;
m;
##   A B C D
## A 0 1 0 0
## B 3 0 2 5
## C 0 0 0 0
## D 0 0 4 0

The as.character() coercions can be omitted if the var1 and var2 input columns are already character vectors.

Data

df <- data.frame(var1=c('A','B','B','D','B'),var2=c('B','C','A','C','D'),var3=c(1L,2L,3L,4L,
5L));

Marginal totals can be added as follows:

m <- cbind(m,Total=rowSums(m));
m <- rbind(m,T=colSums(m));
m;
##   A B C D Total
## A 0 1 0 0     1
## B 3 0 2 5    10
## C 0 0 0 0     0
## D 0 0 4 0     4
## T 3 1 6 5    15
bgoldst
  • 34,190
  • 6
  • 38
  • 64