首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何迭代地创建列?

如何迭代地创建列?
EN

Stack Overflow用户
提问于 2022-04-15 18:03:10
回答 1查看 45关注 0票数 2

这是我的数据样本;

代码语言:javascript
复制
df <- structure(list(Product = c("A", "A", "A", "A", "A"), Month = 8:12, 
    Real = c(1550L, 2238L, 1534L, 726L, 255L), coef = c(0.9503, 
    0.9503, 0.9503, 0.9503, 0.9503)), row.names = c(NA, -5L), class = c("data.table", 
"data.frame"))

我需要为每一行计算一个常量(名为Bias),并使用BiasIter列创建列。

如果这没有什么意义的话,我就是这样做的;

代码语言:javascript
复制
df %>% 
mutate(Iter1 = ceiling(coef*Real)) %>% 
mutate(Bias1 = c(0,((Real[1] - Iter1[1])/Real[1]),rep(0,n() - 2))) %>% 
mutate(Iter2 = ceiling(Iter1*(1 + Bias1))) %>% 
mutate(Bias2 = c(0,0,((Real[2] - Iter2[2])/Real[2]),rep(0,n() - 3))) %>% 
mutate(Iter3 = ceiling(Iter2*(1 + Bias2))) %>% 
mutate(Bias3 = c(0,0,0,((Real[3] - Iter3[3])/Real[3]),rep(0,n() - 4))) %>% 
mutate(Iter4 = ceiling(Iter3*(1 + Bias3))) %>% 
mutate(Bias4 = c(0,0,0,0,((Real[4] - Iter4[4])/Real[4]),rep(0,n() - 5))) %>% 
mutate(Iter5 = ceiling(Iter4*(1 + Bias4))) %>% 
select(-contains('Bias'))

我无法在任何地方适应这种丑陋和硬编码的东西,因为这样的表太多了,而且行数也不同,这意味着我必须为每个表创建的列数是不同的。

我试着把它变成通用的。

这是我想要的输出;

代码语言:javascript
复制
  Product Month  Real  coef Iter1 Iter2 Iter3 Iter4 Iter5
  <chr>   <int> <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 A           8  1550 0.950  1473  1473  1473  1473  1473
2 A           9  2238 0.950  2127  2233  2233  2233  2233
3 A          10  1534 0.950  1458  1458  1462  1462  1462
4 A          11   726 0.950   690   690   690   723   723
5 A          12   255 0.950   243   243   243   243   245

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-15 18:19:03

可以使用递归使用for循环。

代码语言:javascript
复制
coef <- df$coef
 real <- df$Real
 for(i in seq_len(nrow(df))) {
 
     
      if(i == 1) {
        iter <- ceiling(coef* real)
        df[, paste0('Iter', i) := iter]
        bias <- c(rep(0, i),(( real[i]- iter[i])/real[i]),
              rep(0, nrow(df) - (i + 1)))
        df[, paste0("Bias", i) := bias]
      
      
      } else {
           
        iter <-  ceiling(df[[paste0('Iter', i-1)]]*(1 +
              df[[paste0('Bias', i-1)]]))
         df[, paste0('Iter', i) := iter]
         if(i < 5) {
           bias <- c(rep(0, i), ((real[i] - 
           df[[paste0('Iter', i)]][i])/real[i]),rep(0, nrow(df) - (i +1) ))
           df[, paste0("Bias", i) := bias]
           }
      
      }
 
 
}

df[, paste0("Bias", 1:4) := NULL]

-output

代码语言:javascript
复制
> df
   Product Month  Real   coef Iter1 Iter2 Iter3 Iter4 Iter5
    <char> <int> <int>  <num> <num> <num> <num> <num> <num>
1:       A     8  1550 0.9503  1473  1473  1473  1473  1473
2:       A     9  2238 0.9503  2127  2233  2233  2233  2233
3:       A    10  1534 0.9503  1458  1458  1462  1462  1462
4:       A    11   726 0.9503   690   690   690   723   723
5:       A    12   255 0.9503   243   243   243   243   245
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71887393

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档