如何推广union()来获取N个参数?

时间:2015-05-07 07:02:51

标签: r union variadic-functions generalization

如何动态地将数据追加/推送到union

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

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

但有时候我的时间少于4次,而有时甚至超过4次。

任何想法如何解决这个问题?

2 个答案:

答案 0 :(得分:4)

制作一些可重复的数据:

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

我们可以在字符串中使用rbindunique,然后评估:

#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)))

答案 1 :(得分:2)

您可以像下面定义的vunion一样推广自己的功能。不确定这是否真的有效,我的[R]有点陈旧;)

基本上,您接受任意数量的参数(因此...)并使用它们,就像它们被打包在列表中一样。只需从该列表中选择并删除前两项,计算它们的并集,将它们附加到列表中,重复。

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]]))
  }
}