【问题标题】:How to aggregate duplicated rows in data.table by applying a specific function如何通过应用特定函数来聚合 data.table 中的重复行
【发布时间】:2019-09-09 18:04:25
【问题描述】:

我有一个 data.table (r1),其中包含重复的站点和时间值。在这里,我创建了这个示例数据表,已经显示了这些重复项出现的原因,即我最初有两个要合并的数据表。 也许我的问题在合并dt1和dt2的阶段就已经解决了..

dt1 <- data.table(site=c(1,1,2,2), site_type="type1", time=c(1,2,1,2), temp=c(10,12,13,NA), prec=c(10,101,1,1) )
dt2 <- data.table(site=c(3,3,2,2 ), site_type="type2", time=c(1,2,1,2), temp=c(10,12,100,140), prec=c(10,101,1000,NA), snow=c(1,1,1,1))
r1 <- rbindlist(list(dt1,dt2), fill=T)

现在,我想聚合所有重复的行(4 和 8,以及 3 和 7),这样对于列 'temp'、'prec'、'snow' 的值将从 site_type=' type1' 除非它是 NA。

我发现的肮脏解决方案是创建一个包含重复行的 r1 子集,以及一个没有重复行的子集。

duplicates <- r1[duplicated(r1,by=c("site","time")) | duplicated(r1,by=c("site","time"), fromLast=TRUE)]

no_duplicates <- r1[!(duplicated(r1,by=c("site","time")) | duplicated(r1,by=c("site","time"), fromLast=TRUE))]

然后用 lapply 聚合重复项。

aggregated_duplicates <- duplicates[, lapply(.SD, function(x) ifelse(!is.na(x[site_type=="type1"]),x[site_type=="type1"],x[site_type=="type2"])), by=c("site","time")]

然后合并aggregated_duplicates和no_duplicates数据表。

r1_without_duplicates <- rbindlist(list(no_duplicates, aggregated_duplicates), use.names = T)

这种方法似乎可行,但我觉得在数据表中,这可以在合并 dt1 和 dt2 时在一行中完成,或者通过巧妙地使用“重复”或“唯一”来完成。

有什么想法吗?

谢谢!

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    由于您的要求中有 2 个不同的操作,即 (i) 如果 type1 中有 NA,则使用 type2 中的值和 (ii) 行绑定 2 个不同的 data.table,我认为没有一个衬里代码同时执行。

    另一种可能的方法是在执行 rbindlist 并删除欺骗之前先更新 dt1 的 NA 值:

    cols <- c("temp", "prec", "prec")
    dt <- copy(dt1)
    for (j in cols) {
        dt[is.na(get(j)), (j) := dt2[.SD, on=c("site","time"), j, with=FALSE]]
    }
    r2 <- rbindlist(list(dt, dt2), use.names=TRUE, fill=TRUE)
    r2[!duplicated(r2, by=c("site","time"))]
    

    输出:

       site site_type time temp prec snow
    1:    1     type1    1   10   10   NA
    2:    1     type1    2   12  101   NA
    3:    2     type1    1   13    1   NA
    4:    2     type1    2  140    1   NA
    5:    3     type2    1   10   10    1
    6:    3     type2    2   12  101    1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-21
      相关资源
      最近更新 更多