我有一个具有重复 UserId 的数据框 df,其中通常对应列 A、B、C 中至少一行是非空的。列 A、B、C 包含 NA 值和日期。我的目标是将同一 UserID 的所有非空(如果该 UserID 的整列为 NA,则为 NA)行收集在一行中。
我尝试对非NA值使用group_by()和filter(),但结果是空数据帧。我知道下面的代码需要一些修改才能获得所需的结果,但无法弄清楚。
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
最佳答案
我们可以收集
数据帧,删除所有NA
值并将其传播
回来
library(tidyverse)
df %>%
gather(key, value, - UserID) %>%
na.omit() %>%
spread(key, value)
# 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-2018: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 - 从单行中相同 UserID 的不同列收集非空行(POSIXct 格式),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54060278/