【问题标题】:searching text in data frames in R [duplicate]在R中的数据框中搜索文本[重复]
【发布时间】:2018-05-24 05:22:40
【问题描述】:

在 R 中有 2 个不同的数据框

A - 数据集有以下数据

cat
dog
Rat
Parrot
Tiger

B - 数据集有以下数据

Give milk to cat
dog bites
life span of dog is 10 years
Cow gives us milk
Tiger have huge Jaws

现在,R 代码必须检查数据集 A 中每个值的整个 B 数据。

【问题讨论】:

  • 试试grepl(paste(A$col, collapse="|"), B$col, ignore.case = TRUE)
  • 已经尝试过了,但没有准确的结果...
  • 您的预期输出是什么,基于grepl,我得到前 3 个为 TRUE 和其他 FALSE。如果您需要更准确,grepl(paste0("\\b(", paste(A$col, collapse="|"), ")\\b"), B$col, ignore.case = TRUE)
  • 对我来说,它显示 3 条语句为 false .. 并假设如果 A 数据集中有 100 行,B 数据集中有 450 行,那行得通吗?
  • 我复制了您的示例,它显示了正确的输出。尝试使用上面的更新代码

标签: r


【解决方案1】:

一个选项是使用apply 并查找df_A 中的每个单词(如果出现在df_B 中)。 OP 没有明确指定预期的格式。找到的来自df_A 的单词可以在最终输出中使用unlistunique 列出。

library(dplyr)
apply(df_B,1, function(x){
  df_A$Word[(df_A$Word %in% strsplit(x, split=" ")[[1]])]
}) %>% unlist() %>% unique()
#[1] "cat"   "dog"   "Tiger"

#If objective is to find which row in B contains at least a word from df_A then:
df_B$Have_A <- mapply(function(x){
  any(df_A$Word %in% strsplit(x, split=" ")[[1]])
}, df_B$Text)

df_B
#                           Text Have_A
# 1             Give milk to cat   TRUE
# 2                    dog bites   TRUE
# 3 life span of dog is 10 years   TRUE
# 4            Cow gives us milk  FALSE
# 5     Cow have huge advantages   TRUE

数据:

df_B <- read.table(text =
"Text 
'Give milk to cat'
'dog bites'
'life span of dog is 10 years'
'Cow gives us milk'
'Tiger have huge Jaws'",
header = TRUE, stringsAsFactors = FALSE)



df_A <- read.table(text =
"Word 
cat
dog
Rat
Parrot
Tiger",
header = TRUE, stringsAsFactors = FALSE)

【讨论】:

  • 感谢 MKR 的回答,让我们假设如果要添加一些值,例如 df_B 有 df_A 那么是或否,并更改了数据集 B,你可以看看..
  • @Murali 是的,你甚至可以在我的第二个选项中做到这一点。让我更新答案。
  • 感谢 MKR 的回答,尝试执行代码时看到此错误 apply(df_B, 1, function(x) { : dim(X) must have a positive length. can you please告诉我您使用的是哪个版本的 R.. 如果有问题请告诉我
  • 您好 MKR,请检查错误。
  • @Murali 我的 R 版本 3.4.2 (2017-09-28)。我认为你有一个定义为df_B 的向量,它可能会导致你提到的错误。我已将答案更改为使用mapply。你可以试试。 mapply 应该不会出错。
【解决方案2】:

我们可以paste 'A' 数据集中列的元素,并将其用作grepl 中的pattern,通过检查'B' 数据集列中的字符串来获取逻辑向量

i1 <- grepl(paste0("\\b(", paste(A$col, collapse="|"), ")\\b"),
      B$col, ignore.case = TRUE)
i1
#[1]  TRUE  TRUE  TRUE FALSE TRUE

B$col[i1]

数据

A <- structure(list(col = c("cat", "dog", "Rat", "Parrot", "Tiger"
)), .Names = "col", class = "data.frame", row.names = c(NA, -5L
))

B <- structure(list(col = c("Give milk to cat", "dog bites", 
  "life span of dog is 10 years", 
 "Cow gives us milk", "Tiger have huge Jaws")), .Names = "col",
 class = "data.frame", row.names = c(NA, -5L))

【讨论】:

  • Akrun,数据已更改,请您检查一下...
  • @Murali 已更新,现在最后一个将是 TRUE
猜你喜欢
  • 2014-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-05
  • 1970-01-01
  • 2015-12-15
  • 1970-01-01
相关资源
最近更新 更多