使用cbind将do.call的结果分配给数据帧

时间:2018-11-20 00:12:29

标签: r cbind

我想组合两个数据帧(a和a_1,b和b_1等)的多组。基本上,我想做this问题。我创建了两个数据集的列表:

# create data 
a <- c(1, 2, 3)
b <- c(2, 3, 4)
at0H0 <- data.frame(a, b)

c <- c(1, 2, 3)
d <- c(2, 3, 4)
at0H0_1 <- data.frame(c, d)

e <- c(1, 2, 3)
f <- c(2, 3, 4)
at0H1 <- data.frame(a, b)

g <- c(1, 2, 3)
h <- c(2, 3, 4)
at0H1_1 <- data.frame(c, d)

# create lists of names
names <- list("at0H0", "at0H1")
namesLPC <- list("at0H0_1", "at0H1_1")

# column bind the data frames?
dfList <- list(cbind(names, namesLPC))
do.call(cbind, dfList)

但是现在我需要它为每个创建数据帧。此do.call函数仅创建数据帧名称的列表。谢谢!

(进行编辑以制作可复制的代码)

2 个答案:

答案 0 :(得分:2)

这不是超级简单的方法,但是只需对联接功能进行一点编辑就可以达到:

joinfun <- function(x) do.call(cbind, unname(mget(x,inherits=TRUE)))
lapply(Map(c, names, namesLPC), joinfun)
#[[1]]
#  a b c d
#1 1 2 1 2
#2 2 3 2 3
#3 3 4 3 4
# 
#[[2]]
#  a b c d
#1 1 2 1 2
#2 2 3 2 3
#3 3 4 3 4

Map函数根据需要配对数据集名称:

Map(c, names, namesLPC)
#[[1]]
#[1] "at0H0"   "at0H0_1"
#
#[[2]]
#[1] "at0H1"   "at0H1_1"

然后,lapply在上述list的每个部分上循环到mget(多次获取)每个对象,成为一个组合的list。像这样,在第一部分中:

unname(mget(c("at0H0","at0H0_1"),inherits=TRUE))
#[[1]]
#  a b
#1 1 2
#2 2 3
#3 3 4
#
#[[2]]
#  c d
#1 1 2
#2 2 3
#3 3 4

最后,do.call(cbind, ...)将合并后的list放回到单个data.frame中:

do.call(cbind, unname(mget(c("at0H0","at0H0_1"),inherits=TRUE)))
#  a b c d
#1 1 2 1 2
#2 2 3 2 3
#3 3 4 3 4

答案 1 :(得分:0)

我想出了一种方法。一些注意事项:我需要合并360个数据集,这就是i in 1:360的原因。这也从数据集名称数组(dataNames)中命名数据集

for (i in 1:360){
  assign(paste(dataNames[i], sep = ""), cbind(names[[i]], namesLPC[[i]]))
}