在R中的循环中使用Grep函数

时间:2014-01-05 16:18:30

标签: r grep

我可以以某种方式在循环中使用grep函数来搜索在向量中递增的索引变量吗?

for (i in 1:5){
print(grep("i",d))
}

其中d

d<-c(1,2,3,4,5)

在循环的第一次运行中,grep应该搜索1,在下面的2中......是否有某种方式?

4 个答案:

答案 0 :(得分:2)

您可以尝试match,它是矢量化的,因此您不需要循环。

x <- 1:5
set.seed(1)
d <- sample(1:10)
d
# 3  4  5  7  2  8  9  6 10  1

# find positions of (first) matches of x in d
match(x, d)
[1] 10  5  1  2  3

答案 1 :(得分:1)

for (i in 1:5) print(grep(i, d))

答案 2 :(得分:0)

这是一个奇怪的问题,但是你可以:

d<-c(1,2,3,4,5)
for (i in 1:5) { print(grep(get("i"),d)) }

如果你想在任意范围之间找到一些匹配,有更好的方法来做到这一点:

d = sample(1:20,5)
which(d %in% 1:5)
match(d,1:5)
any(d %in% 1:5, na.rm=T)

答案 3 :(得分:0)

与其他人一样,我不确定您的目标是什么,目标是什么,但使用Vectorize创建grep的“矢量化”版本呢?

这是一个可重复的小例子。我们将从一些示例数据开始...包含我们想要查找的内容的向量“d”,以及包含我们想要查看的内容的另一个向量“x”。

d <- c(1,2,3,4,5)
set.seed(1)
x <- paste0(letters[1:2], sample(5, 10, replace = TRUE))
x
#  [1] "a2" "b2" "a3" "b5" "a2" "b5" "a5" "b4" "a4" "b1"

我们只需要将"pattern"参数向量化为grep

vGrep <- Vectorize(grep, vectorize.args = "pattern", SIMPLIFY = FALSE)

我们现在可以像使用grep一样使用这个新功能:

vGrep(d, x)
# [[1]]
# [1] 10
# 
# [[2]]
# [1] 1 2 5
# 
# [[3]]
# [1] 3
# 
# [[4]]
# [1] 8 9
# 
# [[5]]
# [1] 4 6 7
#
vGrep(d, x, value = TRUE)
# [[1]]
# [1] "b1"
# 
# [[2]]
# [1] "a2" "b2" "a2"
# 
# [[3]]
# [1] "a3"
# 
# [[4]]
# [1] "b4" "a4"
# 
# [[5]]
# [1] "b5" "b5" "a5"
#