2016-08-08 10 views
3

私は、NASの多いこのdata.frameを持っている:Rサブセット行の基準によると、因子グループによる

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 

私は2よりも少ないを持っていない唯一の要因グループ行を取得するために、このデータフレームのサブセットをしたいと思いますこのような値は、:

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) 

どれsugges ? (その他のパッケージソリューションは歓迎します)

答えて

2

data.tableを使用できます。 a '、if論理ベクトル(すなわち非NA要素-!is.na(b))のsumが1より大きい場合、' data.frame 'を' data.table '(setDT(df))に変換し、Data.tableをサブセット化します。

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 

またはdplyrを使用して、同じロジックで、 'A' によってグループ化した後、我々は、行をfilter

それともave

df[with(df, ave(b, a, FUN = function(x) sum(!is.na(x))>1)!=0),] 
base R

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 

0

片道はaggregateを使用しています。ユニークなすべてのaNAではない要素の数を数え、それらの行をデータフレームからサブセットする。

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 
関連する問題