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)
但它不起作用.有帮助吗?
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)