【问题标题】:Loop through a dataframe: counting each pairwise combination of a value for each unique variable.循环遍历数据框:计算每个唯一变量的值的每个成对组合。
【发布时间】:2018-09-26 03:21:44
【问题描述】:

我有一个名为“df”的数据框,如下所示:

ID  Value
1   a
1   b
1   c
1   d
3   a
3   b
3   e
3   f
.   .
.   .
.   .

我有一个这样填充零的矩阵:

  a b c d e f 
a x 0 0 0 0 0
b 0 x 0 0 0 0
c 0 0 x 0 0 0
d 0 0 0 x 0 0
e 0 0 0 0 x 0
f 0 0 0 0 0 x

然后我想像这样循环遍历数据框:

for each ID, for each value i, for each value j != i, matrix[i,j] += 1 

所以对于每个 ID,对于每个值组合,我想将矩阵中的值加 1,结果是:

  a b c d e f 
a x 2 1 1 1 1
b 2 x 1 1 1 1
c 1 1 x 1 0 0
d 1 1 1 x 0 0
e 1 1 0 0 x 1
f 1 1 0 0 1 x

例如,[a,b] = 2,因为这种值组合发生在两个不同的 ID 上,而 [a,c] = 1,因为这种值组合仅在 ID = 1 时出现,而不在 ID 时出现= 3。

我怎样才能做到这一点?我已经制作了一个包含唯一 ID 的向量。

提前致谢。

【问题讨论】:

    标签: r loops dataframe combinations


    【解决方案1】:

    最简单的方法是获取table,然后执行crossprod

    out <- crossprod(table(df))
    diag(out) <- NA #replace the diagonals with NA
    names(dimnames(out)) <- NULL #set the names of the dimnames as NULL
    out
    #   a  b  c  d  e  f
    #a NA  2  1  1  1  1
    #b  2 NA  1  1  1  1
    #c  1  1 NA  1  0  0
    #d  1  1  1 NA  0  0
    #e  1  1  0  0 NA  1
    #f  1  1  0  0  1 NA
    

    数据

    df <- structure(list(ID = c(1L, 1L, 1L, 1L, 3L, 3L, 3L, 3L), Value = c("a", 
    "b", "c", "d", "a", "b", "e", "f")), .Names = c("ID", "Value"
     ), class = "data.frame", row.names = c(NA, -8L))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-14
      • 2012-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-29
      • 2021-09-07
      相关资源
      最近更新 更多