关于 regex:grepl() 和 lapply 填充缺失值

grepl() and lapply to fill missing values

我以以下数据为例:

1
fruit.region <- data.frame(full =c("US red apple","bombay Asia mango","gold kiwi New Zealand"), name = c("apple","mango","kiwi"), country = c("US","Asia","New Zealand"), type = c("red","bombay","gold"))

我希望 R 能够查看 "full" (name) 列中没有 "name"、"country" 和 "type\\ 值的其他项目"并查看它们是否与其他项目匹配。例如,如果 full 的第 4 行带有"bombay US mango",它将能够识别出国家应该读作 US,bombay 应该在 type 下,mango 应该在 name 下。

这是我目前所拥有的,它只是(逻辑上)识别项目匹配的位置:

1
2
3
4
5
6
7
new.entry <- c("bombay US mango")
split.new.entry <- strsplit(new.entry,"")

lapply(split.new.entry, function(x){
 check = grepl(x, fruit.region, ignore.case=TRUE)
 print(check)
})

我有点停滞不前..我已经阅读了许多正则表达式帖子和 grepl 上的 r 帮助指南,但无法找到一个很好的解决方案。我所拥有的不能完全识别逻辑"匹配"向量,因此我无法对不同元素进行子集化并使用 if 语句连接。理想情况下,我希望能够以 data.table 形式替换这些元素,因为我的 fruit.region 实际上会在数据表中。有人对最佳方法有任何建议吗?


使用 stringr 库中的 str_detect 函数。这给出了一个列表,准备 rbind:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
library(stringr)
addnewrow <- function(newfruit){
  z<-lapply(fruit.region[,2:4], function(x) x[str_detect(new.entry, x)])
  z$full <- newfruit
  z
}
addnewrow(new.entry)

$name
[1]"mango"

$country
[1]"US"

$type
[1]"bombay"

$full
[1]"bombay US mango"

下一步将取决于您想要的结果 - 如果您只想添加一个,请尝试:

1
rbind(fruit.region, addnewrow(new.entry))

如果你有很多:

1
2
z <- do.call(rbind, lapply(c(new.entry, new.entry), addnewrow))
rbind(fruit.region, z)

请确保您的列是字符优先:

1
fruit.region[] <- lapply(fruit.region, as.character)