R循环文件并计算每行中值之间的差异
我有一个col1,val1和val2的数据帧。请参见下面的示例。”添加diff_row_val1’只是为了解释问题R循环文件并计算每行中值之间的差异,r,R,我有一个col1,val1和val2的数据帧。请参见下面的示例。”添加diff_row_val1’只是为了解释问题 col1 val1 val2 diff_row_val1 1 1000 5000 NA 2 1500 5500 500 3 2000 6000 500 4 2500 6500 500 5
col1 val1 val2 diff_row_val1
1 1000 5000 NA
2 1500 5500 500
3 2000 6000 500
4 2500 6500 500
5 25000 29000 22500
6 25500 29500 500
7 26000 30000 500
8 100 4100 -25900
9 600 4600 500
我想逐行遍历文件&始终检查“val1”列中的值之间的差值是否为=500。我添加了“diff_row_val1”列,因此您可以理解我的意思。如果是这种情况,他应该继续,直到FALSE,并将col1、val1和新列的值存储在输出中:total。总计包含“val1”中值之间的差值之和。在第一种情况下,这是:1500-1000+2000-1500+2500-2000=1500
我的输出应该是这样的
col1 val1 total
1 1000 1500
5 25000 1000
8 100 500
我从for和while循环开始,但我一直在生成输出
total = 0
for (i in 1:nrow(df)) {
while (val1[i+1] == val1[i] + 500) {
total += 500
....
}
}
像这样的
资料
解决方案和输出
让我知道它是否有效 不明白总共是多少is@nurandi补充额外解释不,这不是我想要的。如果您检查我在问题中提供的输出,您将看到它应该只包含3行。在您的解决方案中,所有行都被保留。leadval1-val1可能更习惯地表示为cdiffval1,NA。这也清楚地表明,我们在这里看到的实际上是一个微分的二阶导数微分。
DF <- tribble(~col1, ~val1, ~val2,
1, 1000, 5000,
2, 1500, 5500,
3, 2000, 6000,
4, 2500, 6500,
5, 25000, 29000,
6, 25500, 29500,
7, 26000, 30000,
8, 100, 4100,
9, 600, 4600)
library(dplyr)
DF %>%
mutate(diff = if_else(lead(val1) - val1 == 500, 500, 0),
group = cumsum(c(1, diff(diff) != 0))) %>%
group_by(group) %>%
mutate(total = sum(diff),
n = row_number()) %>%
ungroup %>%
filter(n == 1 & total > 0) %>%
select(-group, -diff, -n)
# A tibble: 3 x 4
# col1 val1 val2 total
# <dbl> <dbl> <dbl> <dbl>
# 1 1 1000 5000 1500
# 2 5 25000 29000 1000
# 3 8 100 4100 500