Группа фильтров только при наличии обоих уровней - PullRequest
0 голосов
/ 26 ноября 2018

Такое ощущение, что это должно быть более простым, и я просто что-то упустил.Цель состоит в том, чтобы отфильтровать данные в новый df, где оба значения var 1 и 2 представлены в группе

, вот некоторые игрушечные данные:

grp <- c (rep («A», 3), rep («B», 2), rep («C», 2), rep («D», 1), rep («E», 2)) </p>

var<- c (1,1,2,1,1,2,1,2,2,2) </p>

id <- c (1:10) </p>

df <- as.data.frame (cbind (id, grp, var)) </p>

только новые grp A и C должны присутствовать в новых данных, потому что они единственные, где присутствуют var 1 и 2.

Я пробовал dplyr, но, очевидно, '&' не сработает, так как он не основан на строках, а '|'просто возвращает тот же df:

df.new <- df%>% group_by (grp)%>% filter (var == 1 & var == 2) # не возвращает строк

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Вот еще один dplyr метод.Это может работать для более чем двух уровней факторов в var.

library(dplyr)

df2 <- df %>%
  group_by(grp) %>%
  filter(all(levels(var) %in% var)) %>%
  ungroup()
df2
# # A tibble: 5 x 3
#   id    grp   var  
#   <fct> <fct> <fct>
# 1 1     A     1    
# 2 2     A     1    
# 3 3     A     2    
# 4 6     C     2    
# 5 7     C     1 
0 голосов
/ 26 ноября 2018

Мы можем обусловить наличие хотя бы одного экземпляра var == 1 и хотя бы одного экземпляра var == 2, выполнив следующие действия:

library(tidyverse)
df1 <- data_frame(grp, var, id) # avoids coercion to character/factor

df1 %>%
    group_by(grp) %>%
    filter(sum(var == 1) > 0 & sum(var == 2) > 0)

  grp     var    id
  <chr> <dbl> <int>
1 A         1     1
2 A         1     2
3 A         2     3
4 C         2     6
5 C         1     7
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...