在循环中填充R中的数据框

时间:2012-11-18 17:13:57

标签: r dataframe

我正在尝试从R中的for循环中填充数据帧。列的名称是在循环内动态生成的,并且某些循环变量的值在填充数据框时用作值。例如,当前列的名称可以是某个变量名称作为循环中的字符串,并且该列可以将当前迭代器的值作为其在数据框中的值。

我试图在循环外创建一个空数据框,就像这个

d = data.frame()

但是我无法对它做任何事情,当我尝试填充它时,我遇到了错误

 d[1] = c(1,2)
Error in `[<-.data.frame`(`*tmp*`, 1, value = c(1, 2)) : 
  replacement has 2 rows, data has 0

实现我的目标可能是一个好方法。如果我不清楚,请告诉我。

5 个答案:

答案 0 :(得分:39)

通常最好避免循环并使用矢量化函数。如果不可能,有两种方法:

  1. 预先分配您的data.frame。建议不要这样做,因为data.frames的索引速度很慢。
  2. 在循环中使用其他数据结构,然后转换为data.framelist在这里非常有用。
  3. 说明一般方法的示例:

    mylist <- list() #create an empty list
    
    for (i in 1:5) {
      vec <- numeric(5) #preallocate a numeric vector
      for (j in 1:5) { #fill the vector
        vec[j] <- i^j 
      }
      mylist[[i]] <- vec #put all vectors in the list
    }
    df <- do.call("rbind",mylist) #combine all vectors into a matrix
    

    在此示例中,没有必要使用list,您可以预先分配matrix。但是,如果您不知道循环需要多少次迭代,则应使用list

    最后,这是示例循环的矢量化替代方法:

    outer(1:5,1:5,function(i,j) i^j)
    

    如您所见,它更简单,也更有效。

答案 1 :(得分:31)

你可以这样做:

 iterations = 10
 variables = 2

 output <- matrix(ncol=variables, nrow=iterations)

 for(i in 1:iterations){
  output[i,] <- runif(2)

 }

 output

然后将其转换为data.frame

 output <- data.frame(output)
 class(output)

这是做什么的:

  1. 根据预期增长创建包含行和列的矩阵
  2. 将2个随机数插入矩阵
  3. 在循环完成后将其转换为数据框

答案 2 :(得分:5)

这也可以。

df = NULL
for (k in 1:10)
    {
       x = 1
       y = 2
       z = 3
       df = rbind(df, data.frame(x,y,z))
     }

输出看起来像这样

df #enter

x y z #col names
1 2 3

答案 3 :(得分:1)

感谢Notable1,与tidytextr一起为我工作 创建一个数据框,其中一列的文件名,另一列的内容。

    diretorio <- "D:/base"
    arquivos <- list.files(diretorio, pattern = "*.PDF")
    quantidade <- length(arquivos)

#
df = NULL
for (k in 1:quantidade) {

      nome = arquivos[k]
      print(nome)
      Sys.sleep(1) 
      dados = read_pdf(arquivos[k],ocr = T)
      print(dados)
      Sys.sleep(1)
      df = rbind(df, data.frame(nome,dados))
      Sys.sleep(1)
}
Encoding(df$text) <- "UTF-8"

答案 4 :(得分:0)

我有一个案例,我需要在for循环函数中使用数据框。 在这种情况下,它是&#34;高效&#34;但是,请记住,数据库很小,循环中的迭代非常简单。但也许代码对于具有类似条件的某些人来说可能是有用的。

for循环目的是在五个地点(即5 Tokio,New York,Sau Paulo,Seul&amp; Mexico city)使用光栅提取功能location有各自的栅格网格。我有一个空间点数据库,在5个不同的位置分配了超过1000个观测值,我需要从10个不同的栅格网格中提取信息(每个位置两个网格)。此外,对于后续分析,我不仅需要栅格值,还需要每个观测值的唯一ID。

准备好空间数据后,其中包括以下任务:

  1. 使用 readOGR 函数导入points shapefile(rgdap包)
  2. 使用栅格功能(光栅包)导入光栅文件
  3. 使用 stack (光栅包)函数将来自同一位置的网格堆叠到一个文件中
  4. 此处 for loop 代码使用数据框

    1。将每个位置的堆叠栅格添加到列表中

    raslist <- list(LOC1,LOC2,LOC3,LOC4,LOC5)
    

    2。创建一个空数据帧,这将是输出文件

    TB <- data.frame(VAR1=double(),VAR2=double(),ID=character())
    

    3。设置循环功能

    L1 <- seq(1,5,1) # the location ID is a numeric variable with values from 1 to 5 
    
    for (i in 1:length(L1)) {
      dat=subset(points,LOCATION==i) # select corresponding points for location [i] 
      t=data.frame(extract(raslist[[i]],dat),dat$ID) # run extract function with points & raster stack for location [i]
      names(t)=c("VAR1","VAR2","ID") 
      TB=rbind(TB,t)
    }