r - 从单行中相同 UserID 的不同列收集非空行(POSIXct 格式)

标签 r dataframe filter group-by dplyr

我有一个具有重复 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/

相关文章:

r - 你可以在 R 中传递引用吗?

r - 离散值到连续尺度

python - Pandas 数据框默认使用 .loc

R - 如何确定数据帧列中的每个值是否为零?

Excel - 从字母数字字符串中提取所有数字

java - 我如何从 Emma 中删除/过滤/忽略某些包(代码覆盖率)

将值替换为另一个数据帧的值

python - 将数据框中的最后 3 个工作日的数据替换为另一个

javascript - 使用 AngularJS 的默认过滤器和用户定义过滤器的输入字段

R 历史 : relationship between 'breaks' value and number/size of bins