2015-09-04 2 views
2

Как-то я мысленно застреваю во время фильтрации патентных данных. Итак, представьте, у вас есть:Фильтрация совпадающих строк в одном файле data.frame

expl <- data.frame(PatNr=c(1,1,1,2,2,2,2,2), Country=c("AZ","AZ","PE","AZ","PS","HQ","HQ","PV")) 

#> PatNr Country 
#> 1  1  AZ 
#> 2  1  AZ 
#> 3  1  PE 
#> 4  2  AZ 
#> 5  2  PS 
#> 6  2  HQ 
#> 7  2  HQ 
#> 8  2  PV 

То, что я хочу, это только те случаи, PatNr в моем data.frame, которые содержат Аз и PS. Все остальные случаи PatNr можно отбросить. Поэтому в данном примере я хотел бы, чтобы скрипт удалял все строки PatNr = 1 и сохранял строки PatNr = 2.

Подмножество строк в этом случае будет состоять из двух строк, поскольку фактические данные имеют еще девять важных переменных, которые различаются для каждой строки.

+0

Чтобы быть понятным, вы хотите выбрать номера патентов, которые имеют две страны: AZ и PS. Верный? – Heroka

+0

О да, пожалуйста. Это проблема, которую я имел, чтобы получить только те, которые содержат обе страны, а не только одну из них. Надо попробовать ваше решение сейчас, выглядит очень многообещающе! –

ответ

7

Использование dplyr:

library(dplyr) 


expl2 <- expl %>% 
    group_by(PatNr) %>% 
    filter(all(c("AZ","PS") %in% Country)) 
expl2 
+0

Действительно люблю это! –

-1

Вот грязный for цикл, который будет делать трюк: я уверен, что есть более эффективные способы, но это должно работать

todelete=numeric(0) 
for(i in unique(expl$PatNr)){ 
    countries = as.character(unique(expl$Country[expl$PatNr==i])) 
    if(!all(c("AZ", "PS") %in% countries)){ 
    todelete=c(todelete, i) 
    } 
} 


expl[!expl$PatNr %in% todelete,] 
1

Использование базового R

res <- lapply(split(expl, expl$PatNr), lvls = c("AZ", "PS"), function(y, lvls)  { 
    y[all(lvls %in% y$Country)] 
}) 
do.call(rbind, res) 
    PatNr Country 
2.4  2  AZ 
2.5  2  PS 
2.6  2  HQ 
2.7  2  HQ 
2.8  2  PV 
Смежные вопросы