4

如何union动态追加/推送数据?

例如,我有 4 个数据集要合并,

mydata <- union(data1, data2, data3, data4)

但有时我有少于 4 个,而有时更多。

有什么想法可以解决这个问题吗?

4

2 回答 2

4

制作一些可重现的数据:

#dummy data
data1 <- data.frame(x=letters[1:3])
data2 <- data.frame(x=letters[2:4])
data3 <- data.frame(x=letters[5:7])

我们可以在字符串中使用rbindwith然后评估: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)))
于 2015-05-07T07:20:09.747 回答
2

您可以滚动您自己的函数,如下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]]))
  }
}
于 2015-05-07T08:16:03.027 回答