【发布时间】: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