2014-09-12 2 views
1

Этот вопрос связан с: Searching a data.frame in RПоиск нескольких шаблонов текста в R

Я хочу найти несколько моделей, например, 'Америка' и 'объединились', в

  1. все поля
  2. в данной области

Как это можно сделать? Случай должен быть проигнорирован.

данных:

ddf 
    id     country   area 
1 1 United States of America North America 
2 2   United Kingdom  Europe 
3 3  United Arab Emirates   Arab 
4 4    Saudi Arabia   Arab 
5 5     Brazil South America 

ddf = structure(list(id = 1:5, country = c("United States of America", 
"United Kingdom", "United Arab Emirates", "Saudi Arabia", "Brazil" 
), area = c("North America", "Europe", "Arab", "Arab", "South America" 
)), .Names = c("id", "country", "area"), class = "data.frame", row.names = c(NA, 
-5L)) 

EDIT: Чтобы уточнить, я должен искать с AND и OR не. В этом примере должны прийти только «Соединенные Штаты Америки» (номер 1). Если я ищу «бразильскую» и «америку», должен прийти номер строки 5 (т. Е. Разные строки поиска могут быть в разных столбцах).

ответ

1

Тупой способ решения проблемы. Заинтересованы в других ответах.

pattern<-c('America','United') 
ddf1<-NULL 
for (i in 1:length(pattern)){ 
    new<-ddf[grep(paste0(pattern[i]),ddf$country),] 
    ddf1<-rbind(ddf1,new) 
} 
+0

Если вы посмотрите на результат DD1, «Соединенные Штаты Америки» приходит дважды. Также я должен искать с AND, а не с OR. – rnso

+0

спасибо. Я не проверял эту часть. 'unique' был бы трюком. –

1

Идя по логике, что ни одна страна в мире не имеет «Америка» перед «Юнайтед» в его названии, вы могли бы сделать

> f <- lapply(ddf, grep, pattern = "(united)(.*)(america)", ignore.case = TRUE) 
> ddf[unique(unlist(f)), ] 
# id     country   area 
# 1 1 United States of America North America 
+0

Я должен искать с AND, а не с OR. – rnso

+0

Пожалуйста, покажите, какой желаемый результат должен быть –

3

Это на самом деле не выполняется для «бразилия» & «америки «случай, но это был полезный испытательный стенд для диагностики логических проблем;

hasAm <- sapply(ddf, grepl, patt="america", ignore.case=TRUE) 
ddf[ rowSums(hasAm) > 0 , ] 
#---------- 
    id     country   area 
1 1 United States of America North America 
5 5     Brazil South America 
#--------- 
hasUn <- sapply(ddf, grepl, patt="united", ignore.case=TRUE) 
#--------- 
ddf[ rowSums(hasAm & hasUn) > 0 , ] 
#----------- 
    id     country   area 
1 1 United States of America North America 

Эта отредактированная версия обобщает эту стратегию, хотя она требует ввода критериев выбора в качестве формулы. Мне нужно было сначала свернуть каждую матрицу, чтобы суммирование по значениям cbind() - not не вызывало множественные удары на одном члене. Таким образом, у меня есть два rowSums, один наружный делается на м матриц -column, где м является число слагаемых в формуле, а внутренний делается на п -column матриц, где п является количество столбцов в данных-аргумент:

dfsel <- function(form, data) { 
     vars = all.vars(form)  
     selmatx <- lapply(vars, function(v) 
           sapply (data, grepl, patt=v, ignore.case=TRUE)) 
     data[ rowSums(do.call(cbind, 
          lapply(selmatx, 
           function(L) {rowSums(L) > 0}))) == length(vars) 
       , ] } 

Демонстрация:

> res <- dfsel(~ united + america , ddf) 
> res 
    id     country   area 
1 1 United States of America North America 

> res <- dfsel(~ brazil + america , ddf) 
> res 
    id country   area 
5 5 Brazil South America 
+0

+1 для примера о том, как использовать формулы в вызовах функций! – ddiez

+0

Я пытался улучшить свои возможности в «вычислениях на языке». –

+0

Если я ищу «бразильскую» и «америку», должен прийти номер строки 5: этого здесь не происходит. – rnso

Смежные вопросы