R循环文件并计算每行中值之间的差异

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’只是为了解释问题

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