从函数生成一系列数据框

Generate a sequence of Data frame from function

我搜索了但找不到类似的问题,如果这是一个重复的问题,请提前致歉。我正在尝试从 R 中的 for 循环中生成数据框。

我想做什么:

  1. 通过函数定义每个数据框的每一列,
  2. 使用循环生成 n 个数据帧(我的数据帧序列的长度),

例如我将使用 n=100 :

    n<-100 
    k<-8 
    d1 <- data.frame()
    for(i in 1:(k)) {d1 <- rbind(d1,c(a="i+1",b="i-1",c="i/1"))}
    d2 <- data.frame()
    for(i in 1:(k+2)) {d2 <- rbind(d2,c(a="i+2",b="i-2",c="i/2"))}
    ...

    d100 <- data.frame()
    for(i in 1:(k+100)) {d100 <- rbind(d100,c(i+100, i-100, i/100))}

很明显,每一个都很难构建data.frame。我试过这个:

d<-list()
for(j in 1:100) {
d[j] <- data.frame()
        for(i in 1:(k+j)) {d[j] <- rbind(d[j] ,c(i+j, i-j, i/j))}

但我真的不能用它做任何事情,我 运行 出错了 :

Error in d[j] <- data.frame() : replacement has length zero
    In addition: Warning messages:
    1: In d[j] <- rbind(d[j], c(i + j, i - j, i/j)) :
      number of items to replace is not a multiple of replacement length

关于您的示例的更多说明:

  1. 每个数据帧的行数不一样:d1有8行,d2有10行,d100有8+100行,
  2. 算法应该给我们:D=(d1,d2, ... ,d100).

如果使用相同的方法 (rbind) 和更基础的方法获得答案,那就太好了。两者都有助于我的理解。当然,如果很明显,请指出我哪里出错了。

以下是创建空 data.frame 的方法(这不是您要尝试的): Create an empty data.frame

并且您不应该创建 100 个单独的数据框,而应该创建一个数据框列表。我不会用 rbind 来做,因为那样会很慢。相反,我会使用 returns 所需结构的数据框的函数来创建它们:

 make_df <- function(n,var) {data.frame( a=(1:n)+var,b=(1:n)-var,c=(1:n)/var) }

 mylist <- setNames( 
            lapply(1:100, function(n) make_df(n,n)) ,  # the dataframes
            paste0("d_", 1:100))   # the names for access

 head(mylist,3)
#---------------
$d_1
  a b c
1 2 0 1

$d_2
  a  b   c
1 3 -1 0.5
2 4  0 1.0

$d_3
  a  b         c
1 4 -2 0.3333333
2 5 -1 0.6666667
3 6  0 1.0000000

然后,如果你想要 "d_40" 数据框,它只是:

 mylist[[ "d_40" ]]

 mylist$d_40

如果你想一次执行相同的操作或者从所有的操作中得到一个结果;只需使用 lapply:

 lapply(mylist, nrow)  # will be a list

或者:

 sapply(mylist, nrow)  #will be a vector because each value is the same length.