【问题标题】:R loop through file and count differences between values in each lineR循环遍历文件并计算每行中值之间的差异
【发布时间】:2020-03-27 14:25:12
【问题描述】:

我有一个带有 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
      ....
  }
}

【问题讨论】:

  • 不明白总数是多少
  • @nurandi 添加了额外的解释

标签: r


【解决方案1】:

这样的?

数据

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

让我知道它是否有效!

【讨论】:

  • 不,这不是我想要的。如果您检查我在问题中提供的输出,您会发现它应该只包含 3 行。使用您的解决方案,所有行都会保留。
  • lead(val1) - val1 可能更惯用地表示为c(diff(val1), NA)。这也表明我们在这里看到的实际上是二阶导数(diff 的 diff)。
猜你喜欢
  • 2013-09-10
  • 2021-07-23
  • 2017-12-06
  • 2019-03-09
  • 2015-11-01
  • 2011-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多