r - R Dplyr; 计算前一行的两列之间的差异,但将结果放入下一行而不使用 for 循环
问题描述
我正在尝试解决以下问题,在该问题中,我希望使用 R 中的 dplyr 计算下一行上两列与下一行之间的差异,最好不使用循环。在这个特定示例中,我想从上一行计算 r_j - s_j,然后将结果粘贴到下一行。
以下是一些示例数据:
require(tidyverse)
data = tibble(LM = c(100, 300, 400, 500, 600, 700, 800, 1300), s_j = c(2,2,2,1,2,2,1,1)) %>%
bind_cols(,r_j = rep(25, nrow(.))
LM s_j r_j
1 100 2 25
2 300 2 25
3 400 2 25
4 500 1 25
5 600 2 25
6 700 2 25
7 800 1 25
8 1300 1 25
我想要的输出是这样的;
LM s_j r_j
1 100 2 25
2 300 2 23
3 400 2 21
4 500 1 19
5 600 2 18
6 700 2 16
7 800 1 14
8 1300 1 13
这个问题的解决方案是:
for (k in 2:nrow(data)){
tmp = data$r_j[k-1] - data$s_j[k-1]
data$r_j[k] = tmp
}
产生
LM s_j r_j
1 100 2 25
2 300 2 23
3 400 2 21
4 500 1 19
5 600 2 18
6 700 2 16
7 800 1 14
8 1300 1 13
但肯定存在比 R 中的 for 循环更好的解决方案吗?谢谢你的帮助。
解决方案
一种方法是生成 s_j 的累积和,然后从 r_j 中减去它
data %>% mutate(
temp = cumsum(s_j),
r_j2 = r_j-temp
)
# A tibble: 8 x 5
LM s_j r_j temp r_j2
<dbl> <dbl> <dbl> <dbl> <dbl>
1 100 2 25 2 23
2 300 2 25 4 21
3 400 2 25 6 19
4 500 1 25 7 18
5 600 2 25 9 16
6 700 2 25 11 14
7 800 1 25 12 13
8 1300 1 25 13 12
编辑:要生成所需的确切输出,可以从其 cumsum 中减去 s_j 的值并得到以下结果:
data %>% mutate(
temp = cumsum(s_j)-s_j,
r_j2 = r_j-temp
)
# A tibble: 8 x 5
LM s_j r_j temp r_j2
<dbl> <dbl> <dbl> <dbl> <dbl>
1 100 2 25 0 25
2 300 2 25 2 23
3 400 2 25 4 21
4 500 1 25 6 19
5 600 2 25 7 18
6 700 2 25 9 16
7 800 1 25 11 14
8 1300 1 25 12 13
EDIT2:包括不需要生成临时列的 IceCreamToucan 的解决方案:
data %>% mutate(
r_j2 = coalesce(lag(r_j - cumsum(s_j)), r_j)
)
# A tibble: 8 x 4
LM s_j r_j r_j2
<dbl> <dbl> <dbl> <dbl>
1 100 2 25 25
2 300 2 25 23
3 400 2 25 21
4 500 1 25 19
5 600 2 25 18
6 700 2 25 16
7 800 1 25 14
8 1300 1 25 13
推荐阅读
- python - 从张量流中的两个现有张量构造一个新张量
- directx - DirectX中使用的GPU调度方法是什么?
- css - 如何使用 box-shadow 制作 css 动画
- install4j - install4j 应用程序使用了错误的代理设置
- reactjs - 新的 context api 应该如何与 React Native navigator 一起使用?
- python - 在 Cython 中使用带有 SSE 内在函数的 C 联合导致 SIGSEGV
- javascript - Angular 5 中的 DOM 操作
- java - 在android中没有通过facebook获取性别
- c++ - 为什么向量比较与 < 运算符比较每个项目两次?
- javascript - 定义辅助链函数