从函数生成一系列数据帧

时间:2015-02-20 23:16:16

标签: r algorithm loops for-loop dataframe

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

我想做什么:

  1. 通过函数
  2. 定义每个数据框的每一列
  3. 使用循环生成n个数据帧(我的数据帧序列的长度),
  4. 例如,我将使用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)。
    3. 使用相同的方法(rbind)和类似基础的方法获得答案会很棒。两者都有助于我的理解。当然,如果显而易见,请指出我出错的地方。

1 个答案:

答案 0 :(得分:3)

以下是如何创建一个空的data.frame(并且它不是你正在尝试的): Create an empty data.frame

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

 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

然后,如果你想要&#34; d_40&#34;数据框只是:

 mylist[[ "d_40" ]]

或者

 mylist$d_40

如果你想在nce上执行相同的操作或从所有这些操作中获得结果;只需使用lapply:

 lapply(mylist, nrow)  # will be a list

或者:

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