我搜索了但是我找不到类似的问题,所以如果这是一个重复的问题,请提前道歉。我正在尝试从R中的for循环内生成数据帧。
我想做什么:
例如,我将使用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
还有一些关于你的例子的评论:
使用相同的方法(rbind)和类似基础的方法获得答案会很棒。两者都有助于我的理解。当然,如果显而易见,请指出我出错的地方。
答案 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.