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) }) |
我有点停滞不前..我已经阅读了许多正则表达式帖子和
使用 stringr 库中的
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) |