R 子集,仅返回具有多行的基于组的完整案例

R 子集,仅返回具有多行的基于组的完整案例,r,dplyr,data.table,plyr,tidyr,R,Dplyr,Data.table,Plyr,Tidyr,如果我有一个data.frame,DF,有5个变量,每个变量的组在1到24行之间-举例如下: GROUP_ID VAR_1 VAR_2 VAR_3 VAR_4 VAR_5 1 2 4 5 6 6 1 3 4 2 3 4 1 4 NA 6 6

如果我有一个data.frame,DF,有5个变量,每个变量的组在1到24行之间-举例如下:

GROUP_ID    VAR_1    VAR_2    VAR_3    VAR_4    VAR_5
1             2        4        5        6        6
1             3        4        2        3        4
1             4       NA        6        6        3
1             3        2        1        2        4
2             9        8        2        7        1
2             2        3        3        2        6
2             2        5        8        9        2
3             2        1        5        6       NA
3            NA       NA        5        8        9
3             4        2        6        8        7
在本例中,完整案例将被定义为具有相应group_ID的任何行中的任何变量中没有NA的组。在本例中,只有group_ID 2表示完整案例


如何对data.frame进行子集划分,使其找到具有完整案例的组,并返回具有该组ID的所有行?在本例中,仅返回组ID 2的所有行?

使用ave的基本R方法是

我们计算每一行中的NAs数量,并为每个组ID中的所有行值筛选具有0 NA的行

或者更简洁一点,得出同样的结果

df[ave(rowSums(is.na(df)) == 0, df$GROUP_ID, FUN = all), ]
您可以使用dplyr进行此操作。首先按分组变量对_进行分组,然后使用filter_at对您关心完整案例的变量进行筛选。这里我们使用starts_with来选择所有VAR变量,因为实际上没有其他列可以使用filter_all。然后,我们使用所有_变量包装谓词,以检查值是否不丢失。这基本上是说,对于每个组,检查每列中的所有值是否为非缺值。如果所有列和所有变量都是这样,则保留该行

图书馆管理员 待定% 按组分组\u ID%>% 过滤变量启动变量,所有变量!是的。 >一个tibble:3x6 >组:组ID[1] >组ID变量1变量2变量3变量4变量5 > > 1 2 9 8 2 7 1 > 2 2 2 3 3 2 6 > 3 2 2 5 8 9 2
由v0.2.1于2018年11月14日创建,这里是一个简单的单线基本R解决方案-

DF[ave(complete.cases(DF), DF$GROUP_ID, FUN = all), ]

  GROUP_ID VAR_1 VAR_2 VAR_3 VAR_4 VAR_5
5        2     9     8     2     7     1
6        2     2     3     3     2     6
7        2     2     5     8     9     2

这里有另一个选项,使用每个组的NA数,以防您也感兴趣

GROUP_ID.NA.COUNT <- tapply(rowSums(is.na(DF[paste("VAR", 1:5, sep = "_")])),
                            DF$GROUP_ID, FUN = sum) # number of NA per group based on values from VAR_1 to VAR_5
DF[DF$GROUP_ID %in% which(GROUP_ID.NA.COUNT == 0), ] # Subset to only return group with 0 NA based on values from VAR_1 to VAR_5

# output
  GROUP_ID VAR_1 VAR_2 VAR_3 VAR_4 VAR_5
5        2     9     8     2     7     1
6        2     2     3     3     2     6
7        2     2     5     8     9     2

如果我在data.frame中有其他变量,但由于只有VAR_1到VAR_5是感兴趣的,所以要从中省略这些变量,那么all_vars函数是否仅适用于filter_at中指定的变量或data.frame中的所有变量?all_vars适用于在vars中选择的变量。未选择的变量将被忽略!非常感谢。
GROUP_ID.NA.COUNT <- tapply(rowSums(is.na(DF[paste("VAR", 1:5, sep = "_")])),
                            DF$GROUP_ID, FUN = sum) # number of NA per group based on values from VAR_1 to VAR_5
DF[DF$GROUP_ID %in% which(GROUP_ID.NA.COUNT == 0), ] # Subset to only return group with 0 NA based on values from VAR_1 to VAR_5

# output
  GROUP_ID VAR_1 VAR_2 VAR_3 VAR_4 VAR_5
5        2     9     8     2     7     1
6        2     2     3     3     2     6
7        2     2     5     8     9     2