[英]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.