【问题标题】:Data frame: Populate matrix with corresponding values of matching cells数据框:使用匹配单元格的相应值填充矩阵
【发布时间】:2016-05-01 07:07:45
【问题描述】:

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

更准确地说:数据框 pat1

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

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

所需的输出是 matrix(data = c(0,1,0,0,1,0,0,0,0,0,0,1,0,0,1,0), nrow=4 , byrow=T) with colnames

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

【问题讨论】:

  • 不清楚。你能显示预期的输出吗? patmat1的维度是多少?
  • @akrun 所需的输出是 matrix(data = c(0,1,1,0), nrow=2, byrow=T) with colnames
  • 请在您的帖子中更新
  • 你可以试试 acast(pat1, ID~ID, value.var="SUB", length) from library(reshape2)
  • 谢谢。我现在已经尝试过了,但它只会改变对角线的值。它应该使用“1”填充 [2A,2B] 和 [2B,2A] 单元格,并且不应更改对角线。

标签: r matrix dataframe


【解决方案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,对单个 list 元素执行 acast 并使用 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,然后使用reshape2中的acast从“长”格式更改为“宽”格式,并将fun.aggregate 指定为length

library(data.table)
acast(setDT(pat1)[, SUB2:= rev(SUB), PATID], SUB~SUB2, 
                    value.var='PATID', length)
#   2A 2B 2C 2D
#2A  0  1  0  0
#2B  1  0  0  0
#2C  0  0  0  1
#2D  0  0  1  0

【讨论】:

  • 谢谢,这个例子很好用。但是,您的代码不可扩展,对吧?如果我想将矩阵扩展为 4x4 维度 - 取决于 SUB 中的唯一值 - 代码在这方面并不灵活,对吧?
  • 非常感谢您的努力!
猜你喜欢
  • 1970-01-01
  • 2018-09-03
  • 2015-12-20
  • 1970-01-01
  • 1970-01-01
  • 2016-11-15
  • 2021-10-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多