2015-06-23 2 views
0

Я пытаюсь найти более элегантный способ извлечения всех строк фрейма данных, если один член группы содержит определенное значение. Например:Какие группы содержат значение - более элегантный код?

id <- c(1,1,2,2,2,3,4,4,5,5) 
cat <- c("A", "B", "A", "B", "C", "B", "C", "D", "A", "E") 
mydf <- data.frame(id, cat) 

id cat 
1 A 
1 B 
2 A 
2 B 
2 C 
3 B 
4 C 
4 D 
5 A 
5 E 

Я хотел бы создать новый фрейм данных с всех строк из идентификаторов, которые содержат C, в этом случае все строки из идентификатора 2 и идентификатором 4, а не только те строки, содержат C.

Я сделал это так, но я думаю, что должно быть более элегантный способ сделать это без создания 2 дополнительных столбцов:

mydf$isC <- ifelse(cat=="C", TRUE, FALSE) 
library(dplyr) 
newdf <- mydf %>% 
    group_by(id) %>% 
    mutate(
    hasC = ifelse(any(isC), TRUE, FALSE) 
) %>% 
    filter(hasC) 

ответ

2

Try

library(dplyr) 
mydf%>% 
    group_by(id) %>% 
    filter(any(cat=='C')) 
# id cat 
#1 2 A 
#2 2 B 
#3 2 C 
#4 4 C 
#5 4 D 

Или, если вам нужно удалить строки с 'C' среди групп, выбранных, используйте & cat!= 'C'

mydf%>% 
    group_by(id) %>% 
    filter(any(cat=='C')& cat!='C') 
# id cat 
#1 2 A 
#2 2 B 
#3 4 D 

Или с помощью data.table

library(data.table) 
setDT(mydf)[,.SD[any(cat=='C') & cat!='C'] , id] 
# id cat 
#1: 2 A 
#2: 2 B 
#3: 4 D 
3

Что-то вроде этого?

subset(mydf, id %in% id[cat=="C"]) 
## id cat 
## 3 2 A 
## 4 2 B 
## 5 2 C 
## 7 4 C 
## 8 4 D 

Или не-интерактивного использования,

mydf[mydf$id %in% mydf$id[mydf$cat == "C"],] 
Смежные вопросы