我有 n 个名为" s.dfx"的数据帧。其中x = 1:n。所有数据帧都有7列,名称不同。现在我想要cbind所有的数据帧。
我知道命令
T< -cbind.data.frame(s.df1,S,DF2,...,s.dfn)
但我想在循环中对它们进行优化和cbind,因为 n 是一个很大的数字。
我试过了
for(t2 in 1:n){
t<-cbind.data.drame(s.df[t2])
}
但是我收到了这个错误&#34; [.data.frame
(s.df,t2)中的错误:选择了未定义的列&#34;
有人可以帮忙吗?
答案 0 :(得分:3)
我不认为for循环会比do.call(cbind, dfs)
更快,但我不清楚你实际上还有这样的列表。我以为你可能需要从一个角色对象构建这样的列表。这个答案假设您还没有列表但是您确实拥有以升序排列的所有数据帧,这些序列以n
结尾,其中十进制表示可能有多个数字。
t <- do.call( cbind, mget( paste0("s.dfs", 1:n) ) )
Pasqui使用ls
内的mget
和一个模式来捕获所有编号的数据帧。我会使用稍微不同的一个,因为你建议这个数字高于9,这就是他的模式所能捕获的:
ls(pattern = "^s\\.df[0-9]+") # any number of digits
# ^ need double escapes to make '.' a literal period or fixed=TRUE
答案 1 :(得分:1)
library(purrr) #to be redundant
#generating dummy data frames
df1 <- data.frame(x = c(1,2), y = letters[1:2])
df2 <- data.frame(x = c(10,20), y = letters[c(10, 20)])
df3 <- data.frame(x = c(100, 200), y = letters[c(11, 22)])
#' DEMO [to be adapted]: capturing the EXAMPLE data frames in a list
dfs <- mget(ls(pattern = "^df[1-3]"))
#A Tidyverse (purrr) Solution
t <- purrr::reduce(.x = dfs, .f = bind_cols)
#Base R
do.call(cbind,dfs)
# or
Reduce(cbind,dfs)