感觉应该更简单,我只是想念一些东西。目标是将数据过滤到一个新的df中,其中var值1和2都在组中表示
这是一些玩具数据:
grp <-c(rep(“ A”,3),rep(“ B”,2),rep(“ C”,2),rep(“ D”,1),rep(“ E”, 2))
var <-c(1,1,2,1,1,2,1,2,2,2)
id <-c(1:10)
df <-as.data.frame(cbind(id,grp,var))
新数据中仅应包含grp A和C,因为它们是唯一存在var 1和2的变量。
我尝试了dplyr,但是显然'&'无效,因为它不是基于行的,并且'|'只是返回相同的df:
df.new <-df%>%group_by(grp)%>%filter(var == 1&var == 2)#不返回任何行
答案 0 :(得分:4)
这是另一种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
答案 1 :(得分:1)
我们可以通过执行以下操作来确定至少有一个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