如何union
动态追加/推送数据?
例如,我有 4 个数据集要合并,
mydata <- union(data1, data2, data3, data4)
但有时我有少于 4 个,而有时更多。
有什么想法可以解决这个问题吗?
如何union
动态追加/推送数据?
例如,我有 4 个数据集要合并,
mydata <- union(data1, data2, data3, data4)
但有时我有少于 4 个,而有时更多。
有什么想法可以解决这个问题吗?
制作一些可重现的数据:
#dummy data
data1 <- data.frame(x=letters[1:3])
data2 <- data.frame(x=letters[2:4])
data3 <- data.frame(x=letters[5:7])
我们可以在字符串中使用rbind
with然后评估:unique
#get list of data frames to merge, update pattern as needed
data_names <- ls()[grepl("data\\d",ls())]
data_names <- paste(data_names,collapse=",")
#make command string
myUnion <- paste0("unique(rbind(",data_names,"))")
#evaluate
eval(parse(text=myUnion))
编辑:
这是另一种更好/更简单的方法,使用do.call
:
unique(do.call("rbind",lapply(objects(pattern="data\\d"),get)))
您可以滚动您自己的函数,如下vunion
定义。不确定这是否真的有效,我的 [R] 有点陈旧;)
基本上,您接受任意数量的参数(因此...
)并使用这些参数,就好像它们被打包在一个列表中一样。只需从该列表中选择并删除前 2 个项目,计算它们的并集,将它们附加到列表中,重复。
vunion <- function(...){
data <- list(...)
n <- length(data)
if(n > 2){
u <- list(t(union(data[[1]], data[[2]])))
return(do.call(vunion, as.list(c(tail(data, -2), u))))
} else {
return(union(data[[1]], data[[2]]))
}
}