我有两个数据框---表A是模式表,表B是名称表。我希望将表B子集,它与表a中的模式匹配。
A <- data.frame(pattern = c("aa", "bb", "cc", "dd"))
B <- data.frame(name = "aa1", "bb1", "abc", "def" ,"ddd")
我正在尝试做一个for循环看起来像:
for (i in 1:nrow(A)){
for (j in 1:nrow(B)){
DT <- data.frame(grep(A$pattern[i], B$name[j], ignore.case = T, value = T))
}}
我希望我的结果表DT
to只包含aa1
,bb1
和ddd
但它超级慢。我只是想知道是否有更有效的方法来做到这一点?很多人!
不需要双循环,以下仅使用sapply
循环。
inx <- unlist(sapply(A$pattern, grep, B$name))
B[inx, , drop = FALSE]
# name
#1 aa1
#2 bb1
#5 ddd
它看起来你的样本输入数据有一个小错误(缺少B$name
没有正确声明,并且需要为两个stringsAsFactors = F
对象包含data.frame
):
> A <- data.frame(pattern = c("aa", "bb", "cc", "dd"), stringsAsFactors = F)
> B <- data.frame(name = c("aa1", "bb1", "abc", "def" ,"ddd"), stringsAsFactors = F)
码
# using sapply with grepl
> indices <- sapply(1:nrow(A), function(z) grepl(A$pattern[z], B$name[z]))
> indices
[1] TRUE TRUE FALSE FALSE
> B[indices, ]
[1] "aa1" "bb1" "ddd"