如何在一个数据框中定义1000个数据帧?

时间:2017-01-27 15:14:50

标签: r

我的问题如下。假设我在R中有1000个数据帧,其名称为eq1.1eq1.2,...,eq1.1000。我想要一个包含1000个数据帧的数据帧。通常情况下,如果我只有两个数据框,比如eq1.1eq1.2那么我可以定义

df <- data.frame(eq1.1,eq1.2)

我很好。但是,我无法遵循此过程,因为我有1000个数据帧。

我能够使用代码

定义包含1000个数据帧名称的列表
names <- c()
for (i in 1:1000){names[i]<- paste0("eq1.",i)} 

但是,我列表中的元素被识别为字符串,而不是我之前定义的数据帧。

感谢任何帮助!

2 个答案:

答案 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