1

想知道是否有人可以提出更简洁的替代方案来实现与以下相同的结果?

我有一个包含三列datetime和的数据框rain。它是每小时降雨记录的数据集。我想创建 96 个新列。每个新列都应返回值,这些值是对 col 执行的滚动总和计算的结果rain

新列和所需的滚动总和遵循以下模式:

  • rain2= 将 colrain中的当前值与其前面的值相加
  • rain3= 将 col 中的当前值与 colrain之前的两个值相加rain
  • .... 等等...
  • rain96= 将 col 中的当前值rain与其前面的 95 个值相加

我已经使用mutateand达到了预期的结果RcppRoll::roll_sum。但是这种方法需要复制和粘贴 96 行代码。

这是创建示例数据集的代码:

df <- tibble(date = as_date(10), time = 9:18, rain = c(2,0,0,3,4,1,15,4,0,0.5))

这是示例数据集:

      date     time rain 
 1 1970-01-11     9   2  
 2 1970-01-11    10   0  
 3 1970-01-11    11   0  
 4 1970-01-11    12   3  
 5 1970-01-11    13   4  
 6 1970-01-11    14   1  
 7 1970-01-11    15  15  
 8 1970-01-11    16   4  
 9 1970-01-11    17   0  
10 1970-01-11    18   0.5

这是所需的结果(注意为简单起见,我从下面的输出中删除了 cols rain4-rain9):

      date     time rain rain2 rain3...  rain10
 1 1970-01-11     9   2   na   na          na
 2 1970-01-11    10   0   2    na          na
 3 1970-01-11    11   0   0    2           na
 4 1970-01-11    12   3   3    3           na
 5 1970-01-11    13   4   7    7           na
 6 1970-01-11    14   1   5    8           na
 7 1970-01-11    15  15   16   20          na
 8 1970-01-11    16   4   19   20          na
 9 1970-01-11    17   0   4    19          29
10 1970-01-11    18   0.5 0.5  4.5         29.5

这是我当前的解决方案,但在应用于我的完整数据集时需要复制和粘贴 96 行代码:

df_new <- df %>% mutate(rain2 = roll_sum(rain,2, fill=NA, align="right"),
                        rain3 = roll_sum(rain,3, fill=NA, align="right"),
                        rain4 = roll_sum(rain,4, fill=NA, align="right"),
                        rain5 = roll_sum(rain,5, fill=NA, align="right"),
                        rain6 = roll_sum(rain,6, fill=NA, align="right"),
                        rain7 = roll_sum(rain,7, fill=NA, align="right"),
                        rain8 = roll_sum(rain,8, fill=NA, align="right"),
                        rain9 = roll_sum(rain,9, fill=NA, align="right"),
                        rain10 = roll_sum(rain,10, fill=NA, align="right"))

谢谢!

4

0 回答 0