簡體   English   中英

刪除多個數據表中的行並保存到原始數據表

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

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