如何动态地将数据追加/推送到union
?
例如,我有4个要合并的数据集,
mydata <- union(data1, data2, data3, data4)
但有时候我的时间少于4次,而有时甚至超过4次。
任何想法如何解决这个问题?
答案 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])
我们可以在字符串中使用rbind
和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)))
答案 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]]))
}
}