从函数生成一系列数据框
Generate a sequence of Data frame from function
我搜索了但找不到类似的问题,如果这是一个重复的问题,请提前致歉。我正在尝试从 R 中的 for 循环中生成数据框。
我想做什么:
- 通过函数定义每个数据框的每一列,
- 使用循环生成 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
关于您的示例的更多说明:
- 每个数据帧的行数不一样:d1有8行,d2有10行,d100有8+100行,
- 算法应该给我们: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.
我搜索了但找不到类似的问题,如果这是一个重复的问题,请提前致歉。我正在尝试从 R 中的 for 循环中生成数据框。
我想做什么:
- 通过函数定义每个数据框的每一列,
- 使用循环生成 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
关于您的示例的更多说明:
- 每个数据帧的行数不一样:d1有8行,d2有10行,d100有8+100行,
- 算法应该给我们: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.