如果数据帧列中的单元格值匹配,我试图用“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)。
我已经搜索过,但还没有找到方法。
答案 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