【问题标题】:looping through a data frame and exporting data循环遍历数据框并导出数据
【发布时间】:2020-08-03 08:37:54
【问题描述】:

我用 x 和 Temp 创建了一个数据框 (df)。

我需要求解两个方程(fb_T = 1.09^Temp 和增长 = (1 * fb_T)),其中 fb_T 是从数据帧的每一行循环遍历 Temp 计算得出的。然后使用每个 fb_T 来计算增长。

理想情况下,我想创建一个包含 x、Temp 以及相应的 fb_T 和增长的数据框,以便我可以绘制它。

我尝试过 (i in seq_len(nrow(df))) 但对于 fb_T,我将第一个值设为 0,然后其余的都是 NA,为了增长,我只得到一个值。

如何让 fb_T 循环遍历数据帧中的 Temp 并让 fb_T 的输出循环遍历增长方程?

 x <- c(1, 2, 3, 4, 5)
 Temp <- c(10, 8, 6, 5, 2)
 df <- cbind(x, Temp)

 init <- rep(NA_real_, n_steps+1)
 init[1] <- 0.
 fbt <- init

 for(i in seq_len(nrow(df))){
   #for(i in 1:nrow(df)) {


    fb_T = 1.09^Temp[i]
    growth = (1 * fb_T)
 }

fbt
growth

我手动计算和预期的输出:

 x <- c(1, 2, 3, 4, 5)
 Temp <- c(10, 8, 6, 5, 2)
 fb_T <- c(2.367364, 1.992563, 1.6771, 1.538624, 1.1881)
 growth <- c(2.367364, 1.992563, 1.6771, 1.538624, 1.1881)
 df <- cbind(x, Temp, fb_T, growth)

【问题讨论】:

    标签: r for-loop


    【解决方案1】:
    d <- tibble(x=c(1, 2, 3, 4, 5), Temp=c(10, 8, 6, 5, 2))
    d %>% mutate(fb_T=1.09**Temp, Growth=fb_T)
    d
    # A tibble: 5 x 4
          x  Temp  fb_T Growth
      <dbl> <dbl> <dbl>  <dbl>
    1     1    10  2.37   2.37
    2     2     8  1.99   1.99
    3     3     6  1.68   1.68
    4     4     5  1.54   1.54
    5     5     2  1.19   1.19
    

    您的代码中只有一个 fb_Tgrowth 值的原因是它们是标量。循环的每次迭代都会覆盖之前的值。

    我分享@RonalShah 对growth = (1 * fb_T) 的困惑。

    【讨论】:

      【解决方案2】:

      您可以直接执行此操作,因为 ^ 已矢量化。

      df <- data.frame(x, Temp)
      df$fb_T <- 1.09^df$Temp
      

      由于growth 列与fb_T 相同,我们可以直接复制它。

      df$growth <- df$fb_T
      df
      #  x Temp     fb_T   growth
      #1 1   10 2.367364 2.367364
      #2 2    8 1.992563 1.992563
      #3 3    6 1.677100 1.677100
      #4 4    5 1.538624 1.538624
      #5 5    2 1.188100 1.188100
      

      如果这是更大流程的一部分,并且您想在循环中执行此操作,我们可以这样做:

      #Initialise new columns
      df$fb_T <- NA
      df$growth <- NA
      
      #For every row
      for(i in seq_len(nrow(df))) {
         df$fb_T[i] = 1.09^df$Temp[i]
         df$growth[i] = (1 * df$fb_T[i])
      }
      

      【讨论】:

      • 主要问题是大约有 100 个方程,并且来自一个输出的结果馈送到下一个输出。数据框也很大。这是我正在测试的一个子集,用于学习如何遍历数据框中的一个变量,然后在下一个等式中使用该输出。然后,我需要将其应用于所有其他方程。是否可以通过循环遍历数据帧然后将该输出放入下一个方程来计算 fb_T?
      猜你喜欢
      • 1970-01-01
      • 2018-05-30
      • 1970-01-01
      • 1970-01-01
      • 2019-12-16
      • 1970-01-01
      • 2020-11-20
      相关资源
      最近更新 更多