根据条件合并行

时间:2020-09-25 08:43:30

标签: r aggregate

我试图基于两个条件(列中的值)合并数据帧中的两行。我的数据如下:

Id    Date          Hour  POL   SJC   ABA
15    01/01/2017       1  15     18   NA
16    01/01/2017       1  NA     NA   4
17    01/01/2017       2  78     56   NA
18    01/01/2017       2  NA     NA   16 

在这种情况下,应将存储在 Date Hour 中的值用作条件,因此应将两行中的日期和小时匹配在一起,以保留每列中的现有值。以下是预期结果:

Id    Date          Hour  POL   SJC   ABA
15    01/01/2017       1  15     18   4
16    01/01/2017       2  78     56   16

我通过使用下一个示例进行了尝试:

db <- aggregate(my_data[-(1:2)], by= my_data[c("Date", "Hour")], 
          function(x) unique(as.numeric(x)))

正如您在这里看到的那样,我正在使用unique()函数尝试保留现有值,但是它似乎无法正常工作。

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

使用dplyr的一个选项可能是:

df %>%
 group_by(Date, Hour) %>%
 summarise(across(everything(), ~ first(na.omit(.))))

  Date        Hour    Id   POL   SJC   ABA
  <chr>      <int> <int> <int> <int> <int>
1 01/01/2017     1    15    15    18     4
2 01/01/2017     2    17    78    56    16

答案 1 :(得分:1)

您对函数aggregate的调用几乎是正确的。在汇总变量之前,只缺少一个逗号。按参数应为要汇总的向量列表。另外,我不会使用unique(x)作为函数,因为如果有多个有效值,它可能会返回一个向量。如果您将max()na.rm=T一起使用,则效果很好。

> d.agg=aggregate(d[,-(1:2)],by=d[,c("Date","Hour")],FUN=max, na.rm=T)
> colnames(d.agg)[1]='Date'
> colnames(d.agg)[2]='Hour'

## Result:
> d.agg
        Date Hour POL SJC ABA
1 01/01/2017    1  15  18   4
2 01/01/2017    2  78  56  16