我正在尝试从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
实现我的目标可能是一个好方法。如果我不清楚,请告诉我。
答案 0 :(得分:39)
通常最好避免循环并使用矢量化函数。如果不可能,有两种方法:
data.frame
。建议不要这样做,因为data.frames
的索引速度很慢。data.frame
。 list
在这里非常有用。说明一般方法的示例:
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)
这是做什么的:
答案 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。
准备好空间数据后,其中包括以下任务:
此处 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)
}