2014-01-05 4 views
1

Могу ли я каким-либо образом использовать функцию grep в цикле для поиска индексной переменной, которая увеличивается в векторе?Использовать функцию Grep в петле в R

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

где d

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

Точка это, что в первом запуске Grep петли должны искать 1, в следующем за 2 .... есть какой-то способ?

+0

Вы хотите найти должность? Или, если он существует? Не цитируйте '' i "', используйте его как переменную и, вероятно, вы хотите, чтобы 'whcih()' или 'match()' находили позицию в векторе. то есть 'which (i == d)' или 'match (i, d)' в зависимости от требований. –

ответ

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 ... ИМХО - правильный ответ! –

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) 
+0

Зачем вам использовать 'get (" i ")' в этой ситуации? Мне любопытно, если у вас есть причина? –

+0

Нет причин использовать get ("i") с данными, представленными в вопросе. Он существует в случае, если вопрос подразумевается как запрос grep, основанный на имени переменной, а не на значении. –

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" 
# 
Смежные вопросы