【问题标题】:How do I create 1s and 0s matrix from 2 vectors of strings?如何从 2 个字符串向量创建 1 和 0 矩阵?
【发布时间】:2019-05-12 12:01:32
【问题描述】:

我正在创建一个 1 和 0 的矩阵。如果单词是字符串的一部分,则为 1,否则为 0。

例如,预期的矩阵如下:

                           white hanging heart holder black suitcase
white hanging heart holder     1       1     1      1     0        0
black suitcase                 0       0     0      0     1        1

我有两个向量:

Itemsvector = c("white hanging heart holder","black suitcase", ...)
Wordsvector = c("white","hanging","heart","holder","black", "suitcase",...)

我在玩弄 %in% 运算符的使用

strsplit(Itemsvector[1], split = ' ')[[1]] %in% Wordsvector

还有

grepl(Wordsvector[1], Itemsvector)

这确实给了我 TRUE 和 FALSE 值,尽管我不知道将这组值映射到整个矩阵网格。

【问题讨论】:

  • 请给出一个可重现的例子,一个不依赖于嵌入图像的例子。
  • 我似乎无法格式化数据,所以最后截屏了。
  • How to make a great R reproducible example?。一个好的 R 问题应该具有读者可以复制粘贴您在问题中提供的内容并让它准确重现您面临的问题的属性。您还可以了解在 Stack Overflow 上拥有 minimal reproducible example 的重要性。
  • 我将所需的数据表示格式化为代码,现在看起来很好:)

标签: r matrix


【解决方案1】:

在将“Itemsvector”拆分为listvectors 后,我们可以使用table 更轻松地完成此操作,将stack 拆分为data.frame 并使用table

table(stack(setNames(strsplit(Itemsvector, " "), Itemsvector))[2:1])
#                             values
#ind                          black hanging heart holder suitcase white
#  white hanging heart holder     0       1     1      1        0     1
#  black suitcase                 1       0     0      0        1     0

mtabulate

library(qdapTools)
mtabulate(setNames(strsplit(Itemsvector, " "), Itemsvector))

【讨论】:

  • 很高兴知道有一个 stack() 函数。这同样有用!谢谢:)
【解决方案2】:

您可以尝试使用双 sapply 并且由于您已经拥有 Wordsvector 来搜索无需再次拆分 Itemsvector。我们可以使用grepl 来查找特定单词是否存在,特别是Itemsvector,为了额外的预防,我们添加了单词边界,使其与"white" 与“whites"”不匹配。

+(t(sapply(Itemsvector, function(x) sapply(Wordsvector, function(y) 
                                  grepl(paste0("\\b",y, "\\b"), x)))))

#                           white hanging heart holder black suitcase
#white hanging heart holder     1       1     1      1     0        0
#black suitcase                 0       0     0      0     1        1

数据

Itemsvector = c("white hanging heart holder","black suitcase")
Wordsvector = c("white","hanging","heart","holder","black", "suitcase")

【讨论】:

  • 谢谢!我使用 grepl 和 for 循环来循环每个单词,但你的更简洁:)
  • 您能澄清一下“\\b”的用法吗?我不太明白它为什么有用。谢谢
  • @AfiqJohari 因为我们在这里使用grepl,所以它匹配字符串中的模式。在这里,我们要匹配确切的单词。检查grepl("white", c("white", "black", "whites"))grepl("\\bwhite\\b", c("white", "black", "whites")) 的输出差异注意在第一种情况下white 如何与whites 匹配(我们不想要),而不是在第二种情况下。因此,我们添加\\b 以避免这种意外的模式匹配。
  • 酷,注意到这一点。再次感谢罗纳克
猜你喜欢
  • 2021-09-10
  • 1970-01-01
  • 2018-05-05
  • 1970-01-01
  • 1970-01-01
  • 2021-08-23
  • 2013-05-28
  • 1970-01-01
  • 2014-07-27
相关资源
最近更新 更多