簡體   English   中英

如何通過應用特定函數來聚合data.table中的重復行

[英]How to aggregate duplicated rows in data.table by applying a specific function

我有一個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時,或者通過智能使用'duplicated'或'unique'在一行中完成。

有任何想法嗎?

謝謝!

由於您的需求中有2個不同的操作,即(i)如果類型1中存在NA,則使用類型2中的值,以及(ii)行綁定2個不同的數據表。我認為沒有單個線性代碼同時執行。

另一種可能的方法是在執行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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM