r按标准和因子组划分的子集行

时间:2016-08-08 12:13:00

标签: r dataframe subset rows

我有这个带有很多NAs的data.frame:

df <- data.frame(a = rep(letters[1:3], each = 3), 
                 b = c(NA, NA, NA, 1, NA, 3, NA, NA, 7))
df
> df
  a  b
1 a NA
2 a NA
3 a NA
4 b  1
5 b NA
6 b  3
7 c NA
8 c NA
9 c  7

我想将此数据框子集化,以仅获取具有不少于两个值的因子组行,例如:

  a  b
1 b 1
2 b NA
3 b 3

我尝试过这个功能,但它不起作用:

subset(df, sum(!is.na(b)) < 1, by = a)

> [1] a b
<0 rows> (or 0-length row.names)

有什么建议吗? (欢迎其他包装解决方案)

2 个答案:

答案 0 :(得分:3)

我们可以使用data.table。将'data.frame'转换为'data.table'(setDT(df)),按'a',if逻辑向量sum分组(即非NA元素 - {{ 1}})大于1,然后Subset the Data.table。

!is.na(b)

或者使用library(data.table) setDT(df)[,if(sum(!is.na(b))>1) .SD , by = a] # a b #1: b 1 #2: b NA #3: b 3 ,使用相同的逻辑,在按'a'分组后,我们dplyr行。

filter

library(dplyr) df %>% group_by(a) %>% filter(sum(!is.na(b))>1) # a b # <fctr> <dbl> #1 b 1 #2 b NA #3 b 3 base R

ave

答案 1 :(得分:1)

一种方法是使用aggregate。计算每个唯一NA不是a的元素数,然后从数据框中设置这些行。

agg <- aggregate(b~a, df, function(x) length(!is.na(x)) >= 2)
df[df$a %in% agg[agg$b, "a"], ]

#  a  b
#4 b  1
#5 b NA
#6 b  3

另一种选择是使用table

df[df$a %in% names(which(table(df$a, is.na(df$b))[,1] > 1)), ]


#  a  b
#4 b  1
#5 b NA
#6 b  3