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){ |
我有点停滞不前..我已经阅读了许多正则表达式帖子和 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 $country $type $full |
下一步将取决于您想要的结果 – 如果您只想添加一个,请尝试:
|
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)
|
- 谢谢你,杰里米 – 这很有帮助。一项后续行动:当 new.entry 是一个行项目时,我似乎在添加值时已经弄清楚了。当我尝试添加类似以下内容的内容时: new.entry <- c(“apple, Asia, gold”,”mango US bombay”,”kiwi, Asia, red”) 然后运行: z <- do.call(rbind, lapply(new.entry, addnewrow)) rbind(fruit.region, z) 我最终得到的输出没有正确地将新项目放入正确的类别中。你知道我做错了什么吗??谢谢
- 您应该将您接受的答案标记为正确,并且可能也会对其进行投票。人们喜欢因为他们的帮助而获得奖励。
来源:https://www.codenong.com/33884894/
