[英]Remove rows in multiple data tables and save to original data table
我想將多個數據表子集化為對應於唯一ID的記錄。 這里和這里有類似的線索; 如果我分別對每個數據表進行編程,那么這些解決方案就可以工作,但是我想在我擁有的所有數據表上運行代碼。
我的數據如下所示:
dt1 <- data.table(var1 = c("A", "B", "C"), var2 = c("...", "...", "..."), id = c("101", "105", "105"))
dt2 <- data.table(var1 = c("D", "E", "F"), var2 = c("...", "...", "..."), var3 = c("...", "...", "..."), id = c("110", "110", "139"))
dt3 <- data.table(var1 = c("B", "G", "H"), id = c("105", "113", "113"))
> dt1
var1 var2 id
1: A ... 101
2: B ... 105
3: C ... 105
> dt2
var1 var2 var3 id
1: D ... ... 110
2: E ... ... 110
3: F ... ... 139
> dt3
var1 id
1: B 105
2: G 113
3: H 113
並且我想刪除所有重復的ID,以便每個數據表最終都是這樣:
> dt1
var1 var2 id
1: A ... 101
> dt2
var1 var2 var3 id
3: F ... ... 139
> dt3
var1 id
1: B 105
我可以使用dt1 <- dt1[, if(.N==1) .SD, by = id]
等成功地分別子集每個數據表,但是我想一次更新每個表。
我已經嘗試過lapply(list(dt1, dt2, dt3), function(x) x[, if(.N==1) .SD, by = id])
但這不會更新我的環境中的表。 如果我將結果保存在列表中,例如使用sub <- lapply(list(dt1, dt2, dt3), function(x) x[, if(.N==1) .SD, by = id])
我可以將數據表另存為dt1 <- as.data.table(sub[1])
等,但是隨后我要為每個數據表手動編碼,這是我要避免的。 我還嘗試了lapply(names(sub), function(x) {assign(x, value=sub[[x]], envir=globalenv())})
,它只是在我的控制台中返回了list()
,但也沒有據我所知更新任何東西。 使用list2env(sub, envir=.GlobalEnv)
所建議這里導致錯誤:“名稱(X)必須為同一長度作為x的字符向量”。
關於如何同時刪除原始數據表中的重復ID記錄的任何建議?
盡管它可以解決您的問題,但這可能不是解決問題的最佳方法。 有時我們無法避免for
循環。
y=c("dt1","dt2","dt3")
for(i in 1:3){
assign(y[i],(get(y[i])[, if(.N==1) .SD, by = id]))
}
現在嘗試調用dt1,其余的
這是另一個duplicated
選項。 我們使用mget
來獲取list
對象的值,然后使用duplicated
刪除“ id” duplicated
的行。 最好將其保留在list
,但是如果需要,則使用list2env
更新全局環境中的對象。
list2env(lapply(mget(paste0("dt", 1:3)),
function(x) x[!(duplicated(id)|duplicated(id, fromLast=TRUE))]), .GlobalEnv)
dt1
# var1 var2 id
#1: A ... 101
dt2
# var1 var2 var3 id
#1: F ... ... 139
dt3
# var1 id
#1: B 105
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.