想知道是否有人可以提出更简洁的替代方案来实现与以下相同的结果?
我有一个包含三列date
、time
和的数据框rain
。它是每小时降雨记录的数据集。我想创建 96 个新列。每个新列都应返回值,这些值是对 col 执行的滚动总和计算的结果rain
。
新列和所需的滚动总和遵循以下模式:
rain2
= 将 colrain
中的当前值与其前面的值相加rain3
= 将 col 中的当前值与 colrain
之前的两个值相加rain
- .... 等等...
rain96
= 将 col 中的当前值rain
与其前面的 95 个值相加
我已经使用mutate
and达到了预期的结果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"))
谢谢!