【发布时间】:2019-01-06 09:35:56
【问题描述】:
我有一个带有重复 UserId 的数据框 df,其中通常对应列 A、B、C 中的至少一行是非空的。列 A、B、C 包含 NA 值和日期。我的目标是在一行中为同一 UserID 收集所有非空(如果该 UserID 的整个列为 NA,则为 NA)行。
我尝试将 group_by() 和 filter() 用于 nonNA 值,但结果是空数据框。我知道下面的代码需要一些修改才能获得所需的结果,但无法弄清楚。
library(dplyr)
示例数据框
df<-data.frame(UserID=c(1,1,1,1,1,1,1,2,2,2,2,2,4,4,4,5,5,5,5),
A=c(NA,'2018-09-20 18:00:55' ,NA,NA,NA,NA,NA,NA,'2018-09-2018:00:55',NA, NA,NA,'2018-09-20 18:00:49',NA,NA,NA,NA,NA,NA),
B=c(NA,NA ,'2018-09-20 18:00:42',NA,NA,NA,NA,NA,NA,'2018-09-20 18:00:55', NA,NA,NA,'2018-09-20 18:00:49',NA,NA,NA,NA,NA),
C=c('2018-09-20 18:00:38', NA,NA,NA,NA,NA,NA,'2018-09-20 18:00:40',NA,NA, NA,NA,NA,NA,NA,NA,'2018-09-20 18:00:49',NA,NA))`
df
UserID A B C
1 1 <NA> <NA> 2018-09-20 18:00:38
2 1 2018-09-20 18:00:55 <NA> <NA>
3 1 <NA> 2018-09-20 18:00:42 <NA>
4 1 <NA> <NA> <NA>
5 1 <NA> <NA> <NA>
6 1 <NA> <NA> <NA>
7 1 <NA> <NA> <NA>
8 2 <NA> <NA> 2018-09-20 18:00:40
9 2 2018-09-20 18:00:55 <NA> <NA>
10 2 <NA> 2018-09-20 18:00:55 <NA>
11 2 <NA> <NA> <NA>
12 2 <NA> <NA> <NA>
13 4 2018-09-20 18:00:49 <NA> <NA>
14 4 <NA> 2018-09-20 18:00:49 <NA>
15 4 <NA> <NA> <NA>
16 5 <NA> <NA> <NA>
17 5 <NA> <NA> 2018-09-20 18:00:49
18 5 <NA> <NA> <NA>
19 5 <NA> <NA> <NA>
我试过的代码
df2<-df %>%
group_by(UserID) %>%
filter(!is.na(A), !is.na(B), !is.na(C))
当前生成的df2 为空
预期输出是
df2
UserID A B C
1 1 2018-09-20 18:00:55 2018-09-20 18:00:42 2018-09-20 18:00:38
2 2 2018-09-20 18:00:55 2018-09-20 18:00:55 2018-09-20 18:00:40
3 4 2018-09-20 18:00:49 2018-09-20 18:00:49 <NA>
4 5 <NA> <NA> 2018-09-20 18:00:49
【问题讨论】:
标签: r dataframe filter group-by dplyr