2016-08-08 6 views
3

I 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 

내가 더 적은이 이상이없는 유일한 요소 그룹 행을 얻기 위해이 dataframe을 부분 집합 싶습니다을 이와 같은 값은 :

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을 사용할 수 있습니다. 'data.frame'을 'a'로 그룹화 한 'data.table'(setDT(df))을 논리 벡터의 sum (즉, 비 NA 요소 - !is.na(b))이 1보다 큰 경우 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입니다. 고유 한 모든 a에 대해 NA이 아닌 요소 수를 계산 한 다음 데이터 프레임에서 해당 행을 하위 설정하십시오.

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