R l oop через файл и считать различия между значениями в каждой строке - PullRequest
0 голосов
/ 27 марта 2020

У меня есть фрейм данных с 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

Я хочу, чтобы l oop через файл строка за строкой и всегда проверял, равна ли разница между значениями в столбце 'val1' = 500 Я добавил столбец diff_row_val1, чтобы вы могли понять, что я имею в виду. Если это так, он должен продолжать до FALSE и сохранять в выходных данных значения из col1, val1 и нового столбца: total. Total содержит сумму различий между значениями в 'val1'. В первом случае это: (1500-1000) + (2000-1500) + (2500-2000) = 1500

Мой вывод должен выглядеть следующим образом

col1    val1    total
   1    1000    1500
   5    25000   1000
   8    100      500

У меня есть началось с for и некоторое время l oop, но я застрял при генерации вывода.

total = 0
for (i in 1:nrow(df)) {
  while (val1[i+1] == val1[i] + 500) {
      total += 500
      ....
  }
}

1 Ответ

1 голос
/ 27 марта 2020

Как-то так?

Данные

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

дайте мне знать если это работает!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...