根据另一个数据帧中的列在一个数据帧中应用regexp

问题描述 投票:1回答:2

我有两个数据框---表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))
}}

我希望我的结果表DTto只包含aa1bb1ddd

但它超级慢。我只是想知道是否有更有效的方法来做到这一点?很多人!

r for-loop apply lapply
2个回答
1
投票

不需要双循环,以下仅使用sapply循环。

inx <- unlist(sapply(A$pattern, grep, B$name))
B[inx, , drop = FALSE]
#  name
#1  aa1
#2  bb1
#5  ddd

1
投票

它看起来你的样本输入数据有一个小错误(缺少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"
© www.soinside.com 2019 - 2024. All rights reserved.