【问题标题】:How to count common concepts and store the result in a matrix?如何计算常见概念并将结果存储在矩阵中?
【发布时间】:2017-02-09 01:22:33
【问题描述】:

我想要/需要创建一个包含常用术语信息的 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

【问题讨论】:

  • 我确实通过更改 osx 中显示在小时旁边的语言图标来写中文 :)

标签: r matrix dataframe lapply


【解决方案1】:

你可以试试

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 左右对输出进行排序。

【讨论】:

  • 这似乎是具有许多列的最快解决方案。通过添加 as.data.frame.matrix(table(col(my.data.frame), as.matrix(my.data.frame))) 效果非常好!
【解决方案2】:

您可以尝试以下方法:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-13
    • 1970-01-01
    • 2016-11-26
    • 2019-09-08
    • 1970-01-01
    相关资源
    最近更新 更多