2015-06-13 52 views
2

我想過濾我的數據集以將觀察結果保留在特定列中。爲了說明:使用group_by在保留NAs的同時過濾特定案例

help <- data.frame(deid = c(5, 5, 5, 5, 5, 12, 12, 12, 12, 17, 17, 17), 
       score.a = c(NA, 1, 1, 1, NA, NA, NA, NA, NA, NA, 1, NA)) 

創建

deid score.a 
1  5  NA 
2  5  1 
3  5  1 
4  5  1 
5  5  NA 
6 12  NA 
7 12  NA 
8 12  NA 
9 12  NA 
10 17  NA 
11 17  1 
12 17  NA 

而且我要告訴dplyr保持有任何意見在score.a案件,包括NA值。因此,我希望它返回:

deid score.a 
1  5  NA 
2  5  1 
3  5  1 
4  5  1 
5  5  NA 
6 17  NA 
7 17  1 
8 17  NA 

我跑不過它抽來港定居,以及代碼help %>% group_by(deid) %>% filter(score.a > 0)。感謝您的幫助。

編輯:在這裏問了一個類似的問題How to remove groups of observation with dplyr::filter() 但是,在答案中他們使用'all'條件,這需要使用'any'條件。

+1

可能重複的[如何清除的觀察基團與dplyr ::濾波器()](http://stackoverflow.com/questions/24583152/how-to-remove-groups-of-observation-with-dplyrfilter) – shadowtalker

+0

假設如果'help $ score.a [3] < - -1',結果是什麼? – akrun

+0

不確定我在追蹤你的問題,@akrun ...對不起。當我運行時,score.a的第三行是-1 – bpace

回答

4

嘗試

library(dplyr) 
help %>% 
     group_by(deid) %>% 
     filter(any(score.a >0 & !is.na(score.a))) 
# deid score.a 
#1 5  NA 
#2 5  1 
#3 5  1 
#4 5  1 
#5 5  NA 
#6 17  NA 
#7 17  1 
#8 17  NA 

或用data.table

library(data.table) 
setDT(help)[, if(any(score.a>0 & !is.na(score.a))) .SD , deid] 
# deid score.a 
#1: 5  NA 
#2: 5  1 
#3: 5  1 
#4: 5  1 
#5: 5  NA 
#6: 17  NA 
#7: 17  1 
#8: 17  NA 

類似的方法如果條件爲於子集「DEID與在所有的值 'score.a'> 0,則上面的代碼可修改爲,

setDT(help)[, if(!all(is.na(score.a)) & 
     all(score.a[!is.na(score.a)]>0)) .SD , deid] 
# deid score.a 
#1: 5  NA 
#2: 5  1 
#3: 5  1 
#4: 5  1 
#5: 5  NA 
#6: 17  NA 
#7: 17  1 
#8: 17  NA 

假設'deid'組中'score.a'之一小於一個0,

help$score.a[3] <- -1 

上面的代碼將返回的

setDT(help)[, if(!all(is.na(score.a)) & 
      all(score.a[!is.na(score.a)]>0, deid], 
# deid score.a 
#1: 17  NA 
#2: 17  1 
#3: 17  NA 
2
library(dplyr) 
df%>%group_by(deid)%>%filter(sum(score.a,na.rm=T)>0) 
+0

如果'help $ score.a [2] < - -0.2; help $ score.a [3] < - 0.2;幫助$ score.a [3] < - 0' – akrun

+0

有趣的是,我改成了df%>%group_by(deid)%>%filter(sum(!is.na(score.a))> 0)工作,但我不知道爲什麼。 –

+0

但這又是不正確的,因爲'help $ score.a [2:4] < - -0.2'在這種情況下,所有值對於deid'5'都是負值,但它返回該組。 – akrun