我的问题如下。假设我在R中有1000个数据帧,其名称为eq1.1
,eq1.2
,...,eq1.1000
。我想要一个包含1000个数据帧的数据帧。通常情况下,如果我只有两个数据框,比如eq1.1
和eq1.2
那么我可以定义
df <- data.frame(eq1.1,eq1.2)
我很好。但是,我无法遵循此过程,因为我有1000个数据帧。
我能够使用代码
定义包含1000个数据帧名称的列表names <- c()
for (i in 1:1000){names[i]<- paste0("eq1.",i)}
但是,我列表中的元素被识别为字符串,而不是我之前定义的数据帧。
感谢任何帮助!
答案 0 :(得分:1)
怎么样
df.names <- ls(pattern = "^eq1\\.\\d")
eq1.dat <- do.call(cbind,
lapply(df.names,
get))
rm(list = df.names)
答案 1 :(得分:0)
library(stringi)
library(dplyr)
#recreate dummy data
lapply(1:1000,function(i){
assign(sprintf("eq1.%s",i),
as.data.frame(matrix(ncol = 12, nrow = 13, sample(1:15))),
envir = .GlobalEnv)
})
#现在我的工作环境中有1000个数据框,名为eq1。[1:1000]
> str(ls(pattern = "eq1.\\d+"))
> chr [1:1000] "eq1.1" "eq1.10" "eq1.100" "eq1.1000" "eq1.101" "eq1.102" "eq1.103" ...
1)从将附加的ep1.1数据帧创建一个保持数据帧 以下循环中的每次迭代
empty_df <- eq1.1
2)即时搜索按惯例命名的所有数据框 从返回的字符创建一个数据框,代表我们的数据框 对象,但只不过是一个字符串。
3)改变该数据帧以保存索引列,以便我可以从1:1000正确排序数据帧,因为字符表示将不是从上面的步骤按数字顺序
4)一旦数据帧名称按正确顺序删除索引列
然后将dfs
列重新列入字符序列和切片
第一个值,因为它已经存储到我们的empty_df
5)循环遍历该序列,并且对于每次迭代,全局分配和 将前面的数据框绑定到位。例如,在迭代1中, empty_df现在与data.frame(ep1.1,ep1.2)相同,并且对于 第二次迭代,empty_df与data.frame(ep1.1,ep1.2,ep1.3)相同
get
函数接受字符表示并从中调用数据对象。看?获取详细信息lapply(
data.frame(dfs = ls(pattern = 'eq1\\.\\d+'))%>%
mutate(nth = as.numeric(stri_extract_last_regex(dfs,'\\d+'))) %>%
arrange(nth) %>% select(-nth) %>% slice(-1) %>% .$dfs, function(i){
empty_df <<- data.frame(empty_df, get(i))
}
)
全部完成后,所有数据帧都绑定到empty_df并检查
> dim(empty_df)
[1] 13 12000