计算多列data.frame R中值之间的唯一组合

时间:2018-03-02 15:22:53

标签: r dataframe matrix count combinations

我有一个看起来像这样的data.frame:

  value 1 | value 2 | value 3 | value 4
   rock   |    pop  |    N/A  |   N/A
   pop    | hip hop |    rap  |   blues
   pop    |    punk |    rock |   funk
   blues  |    punk |    rap  |   N/A

我想基于值的唯一组合创建矩阵,而不管它们所在的列。基于上面的示例,第1行和第3行都具有pop和rock值的组合。 列数可能因行而异,但随着时间的推移,data.frame将频繁更新。

我如何创建一个看起来像这样的矩阵?

          | rock    | pop     | punk
   rock   |    0    |    2    |   1
   pop    |    2    |    0    |   0
   punk   |    1    |    0    |   1

如果问题或格式不明确,请道歉。这是我在Stackoverflow上的第一个问题。

1 个答案:

答案 0 :(得分:1)

如果我理解正确,你应该可以这样做:

ul <- sort(na.omit(unique(unlist(mydf, use.names = FALSE))))
ul
# [1] "blues"   "funk"    "hip hop" "pop"     "punk"    "rap"     "rock" 

tcrossprod(apply(mydf, 1, function(x) table(factor(x, ul))))
#         blues funk hip hop pop punk rap rock
# blues       2    0       1   1    1   2    0
# funk        0    1       0   1    1   0    1
# hip hop     1    0       1   1    0   1    0
# pop         1    1       1   3    1   1    2
# punk        1    1       0   1    2   1    1
# rap         2    0       1   1    1   2    0
# rock        0    1       0   2    1   0    2

您可以将diag onal设置为&#34; 0&#34;如果需要。

示例数据:

mydf <- structure(list(value.1 = c("rock", "pop", "pop", "blues"), value.2 = c("pop", 
    "hip hop", "punk", "punk"), value.3 = c(NA, "rap", "rock", "rap"
    ), value.4 = c(NA, "blues", "funk", NA)), .Names = c("value.1", 
    "value.2", "value.3", "value.4"), row.names = c(NA, 4L), class = "data.frame")