我有一个看起来像这样的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上的第一个问题。
答案 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")