我想/需要创建1和0的矩阵,其中包含有关常用术语的信息。我在列之间创建了一个常用术语矩阵(例如,像1,4,2这样的行),但我不知道如何对它进行分解。
这是一个玩具和可重复的例子。步骤(1) - (4)没问题,步骤(5)是我目前无法做到的。
(1)我有这个(虚构的)数据集
vec1 <- c("apple","pear","apple and pear")
vec2 <- c("apple and pear","banana","orange")
vec3 <- c("orange and pear","banana","apple")
my.data.frame <- as.data.frame(cbind(vec1,vec2,vec3))
vec1 vec2 vec3
1 apple apple and pear orange and pear
2 pear banana banana
3 apple and pear orange apple
(2)我提取变量和内容
vectors.list <- as.vector(colnames(my.data.frame))
list.of.fruits <- unique(as.vector(unlist(my.data.frame)))
(2)我写下了一个计算常用术语的函数(这是这篇文章的变形:How to count common words and store the result in a matrix?)
common.fruits <- function(vList) {
v <- lapply(vList, tolower)
do.call(rbind, lapply(v, function(x) {
do.call(c, lapply(v, function(y) length(intersect(x, y))))
}))
}
(4)我使用get和lapply做一些有效的(我猜)计算
compare <- lapply(vectors.list,get)
common.terms.matrix <- common.fruits(compare)
rownames(common.terms.matrix) <- vectors.list
colnames(common.terms.matrix) <- vectors.list
common.terms.matrix
vec1 vec2 vec3
vec1 3 1 1
vec2 1 3 1
vec3 1 1 3
(5)如何将最后一个矩阵分解为此矩阵或data.frame(“|”表示这是手工编写的)
| apple | pear | apple and pear | banana | orange | orange and pear
vec1 | 1 | 1 | 1 | 0 | 0 | 0
vec2 | 0 | 0 | 1 | 1 | 1 | 0
vec3 | 1 | 0 | 0 | 1 | 0 | 1
答案 0 :(得分:5)
你可以尝试
table(col(my.data.frame), as.matrix(my.data.frame))
apple apple and pear banana orange orange and pear pear
1 1 1 0 0 0 1
2 0 1 1 1 0 0
3 1 0 1 0 1 0
然后您可以使用sort
左右订购输出。
答案 1 :(得分:1)
您可以尝试以下内容:
my.data.frame$id <- 1:nrow(my.data.frame)
m <- melt(my.data.frame, id='id')
m$val <- 1
df <- dcast(m, variable~value, value.var='val')
df[is.na(df)] <- 0
df
variable apple apple and pear banana orange orange and pear pear
1 vec1 1 1 0 0 0 1
2 vec2 0 1 1 1 0 0
3 vec3 1 0 1 0 1 0