Подмножество и группа в R - PullRequest
2 голосов
/ 28 апреля 2019

Я хотел бы установить подмножество моего фрейма данных, вот пример:

groups  names   col3
group1  Sp1 OK  
group1  Sp3 OK
group1  Sp7 OK
group1  Sp3 OK
group2  Sp1 OK
group2  Sp2 OK
group2  Sp3 OK
group3  Sp1 OK
group4  Sp1 OK
group4  Sp2 OK
group4  Sp2 OK

, и идея заключается в том, чтобы для каждой группы оставались только те, которые содержат как Sp1 и Sp2, так и удалялисьпрочее

Здесь я должен держать группы 2 and 4:

groups  names   col3
group2  Sp1 OK
group2  Sp2 OK
group2  Sp3 OK
group4  Sp1 OK
group4  Sp2 OK
group4  Sp2 OK

Я пробовал что-то вроде:

df2=df %>%
  group_by(groups) %>%
  df$names == "Sp1" & df$names == "Sp2"

Но это не похоже на правильный путь.

Спасибо за вашу помощь.

1 Ответ

2 голосов
/ 28 апреля 2019

Мы можем использовать filter после шага group_by и убедиться, что в группе есть и «Sp1», и «Sp2» с %in% и all

library(dplyr)
df %>% 
   group_by(groups) %>%
   filter(all(c("Sp1", "Sp2") %in% names))
# A tibble: 6 x 3
# Groups:   groups [2]
#  groups names col3 
#  <chr>  <chr> <chr>
#1 group2 Sp1   OK   
#2 group2 Sp2   OK   
#3 group2 Sp3   OK   
#4 group4 Sp1   OK   
#5 group4 Sp2   OK   
#6 group4 Sp2   OK  

Или используя base R с table и subset

subset(df, groups %in% names(which(!rowSums(!table(subset(df, 
        names %in% c("Sp1", "Sp2"), select = 1:2))))))

Обратите внимание, что проблема с использованием & заключается в том, что мы проверяем, находятся ли оба «Sp1» и «Sp2» вта же строка «имен», что вряд ли произойдет. Вместо этого логика будет заключаться в том, можно ли найти их обоих в «именах» для конкретной группы

data

df <- structure(list(groups = c("group1", "group1", "group1", "group1", 
"group2", "group2", "group2", "group3", "group4", "group4", "group4"
), names = c("Sp1", "Sp3", "Sp7", "Sp3", "Sp1", "Sp2", "Sp3", 
"Sp1", "Sp1", "Sp2", "Sp2"), col3 = c("OK", "OK", "OK", "OK", 
"OK", "OK", "OK", "OK", "OK", "OK", "OK")),
class = "data.frame", row.names = c(NA, 
-11L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...