2013-06-28 5 views
3

Прямо сейчас я работаю с символьным вектором в R, что я использую strsplit для разделения по слову. Мне интересно, есть ли функция, которую я могу использовать для проверки всего списка, и посмотреть, есть ли в списке конкретное слово, и (если возможно) указать, какие элементы списка он находится.Поиск элементов списков в R

ex.

a = c("a","b","c") 
b= c("b","d","e") 
c = c("a","e","f") 

Если z=list(a,b,c), то f("a",z) бы оптимально выход [1] 1 3 и f("b",z) бы оптимально выход [1] 1 2

Любая помощь будет замечательно.

ответ

14

Как alexwhan говорит, grep функция для использования. Однако, будьте осторожны об использовании его со списком. Это не делает то, что вы можете себе представить. Например:

grep("c", z) 
[1] 1 2 3 # ? 

grep(",", z) 
[1] 1 2 3 # ??? 

То, что происходит за кулисами, что grep принуждают его 2-й аргумент характера, используя as.character. Когда применяется к списку, то, что возвращает as.character, представляет собой представление символа из этого списка как получено путем deparsing его. (Modulo unlist.)

as.character(z) 
[1] "c(\"a\", \"b\", \"c\")" "c(\"b\", \"d\", \"e\")" "c(\"a\", \"e\", \"f\")" 

cat(as.character(z)) 
c("a", "b", "c") c("b", "d", "e") c("a", "e", "f") 

Это то, что grep работает над.

Если вы хотите запустить grep в списке, более безопасным способом является использование lapply. Это возвращает другой список, который вы можете использовать, чтобы извлечь интересующее вас.

res <- lapply(z, function(ch) grep("a", ch)) 
res 
[[1]] 
[1] 1 

[[2]] 
integer(0) 

[[3]] 
[1] 1 


# which vectors contain a search term 
sapply(res, function(x) length(x) > 0) 
[1] TRUE FALSE TRUE 
+0

Хорошее объяснение, хорошая точка – alexwhan

+0

Спасибо за этот ввод. Я обязательно буду помнить об этом в следующем проекте, где, вероятно, буду делать что-то подобное, но метод alexwhan подходит для моих целей достаточно хорошо, и он уже запущен. – riders994

+0

Ответ Хонга велик. Просто добавьте немного функциональности для того, что это стоит. Чтобы получить только сами хиты, используйте это: 'unlist (lapply (z, function (ch) grep (" a ", ch, value = TRUE)))' –

4

Вы ищете grep():

grep("a", z) 
#[1] 1 3 

grep("b", z) 
#[1] 1 2 
+0

Да, я думал, что работаю только на векторах ... Большое спасибо! – riders994

+1

Попробуйте 'is.vector (z)'. Мой прогноз: вы будете удивлены. –

+0

Это объясняет ошибки за неделю. – riders994