如何在条件下将列表的所有元素与另一个数据表合并

qua*_*ant 5 merge r list data.table

我有以下数据:

library(data.table)

dt1 <- data.table(var1 = c("wk1","wk1","wk2"),
                  var2 = c(1,2,3))

dt2 <- data.table(var3 = c("a","b","c"),
                  var2 = c(1,2,3))

lista <- list(dt1,dt2)

dt_main <- data.table(var1 = c("wk1","wk2"),
                      var4 = c(100,200))
Run Code Online (Sandbox Code Playgroud)

我希望merge所有元素lista都包含变量var1with dt_main data.table,所以最后我想lista看起来像这样:

dt1 <- data.table(var1 = c("wk1","wk1","wk2"),
                  var2 = c(1,2,3),
                  var4 = c(100,100,200))

dt2 <- data.table(var3 = c("a","b","c"),
                  var2 = c(1,2,3))

lista <- list(dt1,dt2)
Run Code Online (Sandbox Code Playgroud)

我试过了

mapply(function(X,Y){
  if("var1"%in%names(X)){
    X <- merge(X,Y,by="var1")
  }
},X=lista,Y=dt_main)
Run Code Online (Sandbox Code Playgroud)

但它不起作用.有帮助吗?

Lyz*_*deR 4

lapply您可以在函数内使用and merge :

lapply(lista, function(x) if (!is.null(x$var1)) {

  #the function checks if there is a var1 column
  #and if there is, it gets merged to the x data.table
  return(merge(dt_main, x, by = 'var1', all.x = TRUE))

} else {

  #otherwise it just returns the data.table
  return(x)

})

# [[1]]
#    var1 var4 var2
# 1:  wk1  100    1
# 2:  wk1  100    2
# 3:  wk2  200    3
# 
# [[2]]
#    var3 var2
# 1:    a    1
# 2:    b    2
# 3:    c    3
Run Code Online (Sandbox Code Playgroud)

  • 有点晚了,但我想出了一个稍微不同的变体: `lapply(lista, function(x) if ('var' %in% names(x)) x[dt_main, on = 'var1', var4 := var4] 否则 x)` (3认同)