数据框:使用匹配单元格的相应值填充矩阵

时间:2016-01-25 03:39:55

标签: r matrix dataframe

如果数据帧列中的单元格值匹配,我试图用“1”填充邻接矩阵。 “1”的位置基于同一行中的相应值。

更确切地说:数据框pat1

ID PATID SUB
 1     2  2A
 2     2  2B 
 3     3  2C
 4     3  2D

我想在一个空矩阵[2A,2B]中填充矩阵单元格[2B,2A][2C,2D][2D,2C]patmat1以及相应的行/山坳。自PATID[1]=PATID[2]以来分别带有“1”的名称和PATID[3]=PATID[4]

所需的输出是矩阵(data = c(0,1,0,0,1,0,0,0,0,0,0,1,0,0,1,0),nrow = 4 ,byrow = T)with colnames< - rownames< - c(“2A”,“2B”,“2C”,“2D”)在这个例子中,patmat1维度为4 4(2A,2B,2C, 2D)。

我已经搜索过,但还没有找到方法。

1 个答案:

答案 0 :(得分:1)

可能有帮助

library(reshape2)
 if(length(unique(pat1$PATID))==1) pat1$SUB2 <- rev(pat1$SUB)
acast(pat1, SUB~SUB2, value.var='PATID', length)
#   2A 2B
#2A  0  1
#2B  1  0

更新

对于新数据集,我们可以通过“PATID”split,对单个acast元素执行list并使用bdiag折叠它们。

library(Matrix)
patmat1[] <- as.matrix(bdiag(lapply(lst, function(x) 
        acast(transform(x, SUB2=rev(SUB)), SUB~SUB2, 
        value.var='PATID', length))))
patmat1
#   2A 2B 2C 2D
#2A  0  1  0  0
#2B  1  0  0  0
#2C  0  0  0  1
#2D  0  0  1  0

或者我们可以使用data.table来完成此操作。我们将'data.frame'转换为'data.table'(setDT(pat1)),按'PATID'分组,创建'SUB2'作为'SUB'的rev,然后使用{{1从acast开始,将“长”更改为“广”格式,并将reshape2指定为fun.aggregate

length