2

我以以下数据为例:

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 的第 4 行带有“bombay US mango”,它将能够识别该国家/地区应为 US,bombay 应在 type 下,mango 应在 name 下。

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

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)
})

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

4

1 回答 1

1

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

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"

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

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

如果你有很多:

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

注意确保您的列首先是字符:

fruit.region[] <- lapply(fruit.region, as.character)
于 2015-11-24T03:52:12.007 回答