我有这个带有很多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)
有什么建议吗? (欢迎其他包装解决方案)
答案 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