R语言 循环迭代的空对象cbind

siv3szwd  于 2023-03-15  发布在  其他
关注(0)|答案(1)|浏览(172)

我想用两个data.frame对象做一个cbind。但是第一个是空的,只是为循环迭代创建的。我想知道这是否可能。
当我尝试:
data <- data.frame()
data1 <- cbind(data, mpg)
Dataframe 中的错误(...,检查名称= FALSE):参数表示不同的行数:0、234
我没有成功。
我的循环稍微长一点,但一般来说,我有大约100个文件,我需要在其中创建taxa_col_name变量,并需要将循环中生成的data.frame添加到data.frame中,这将是我的最终基础。

data <- data.frame()
    
for (i in 1:100) {
rate_col_name <- sprintf("rate_%s", i)
data1 <- data1 %>%
mutate(!!rate_col_name:=
       (population_2000)*((population_2010/population_2000_previous)))
       data1$population_2010 = NULL
       data1$population_2000_previous <- NULL
       rm(pop_2000_previous, pop_2010)
       gc()
date <- cbind(date, date1)
}
vptzau2j

vptzau2j1#

当你试图用data1cbind现有的空的data时会发生这种情况,data1实际上有行,大概有一列,这是因为对于cbind,两个 Dataframe 需要有相同的行数,产生这种错误的最小例子是:

> data <- data.frame()
> data_input <- data.frame(mydata=1:10)
> cbind(data, data1)
Error in data.frame(..., check.names = FALSE) : 
  arguments imply differing number of rows: 0, 10

对你来说,这发生在你的循环的第一次迭代的末尾,这里有一个简短的版本:

> data_input <- rnorm(n = 10)
> data <- data.frame()
> for (i in 1:10) {
+   message("I'm in iteration ", i)
+   data1 <- data_input + i 
+   data <- cbind(data, data1)
+ }
I'm in iteration 1
Error in data.frame(..., check.names = FALSE) : 
  arguments imply differing number of rows: 0, 10

一种解决方案是在循环的第一次迭代中用实际数据初始化data

data_input <- seq(from=100, to=1000, by=100)
for (i in 1:10) {
  data1 <- data_input + i
  if(i==1){
    data <- data.frame(data1)
  }else{
    data <- cbind(data, data1)
  }
}

也可以在循环外“手动”进行第一次迭代,然后在2而不是1开始循环:

data_input <- seq(from=100, to=1000, by=100)
data1 <- data_input + 1
data <- data.frame(data1)
for (i in 2:10) {
  data1 <- data_input + i
  data <- cbind(data, data1)
}

另一种解决方案是从list开始,最后将其转变为data.frame

data_input <- seq(from=100, to=1000, by=100)
data <- list()
for (i in 1:10){
  data1 <- data_input + i
  data[[i]] <- data1
}
data <- data.frame(do.call('cbind', data))

相关问题