Как суммировать столбец значений последовательно строка за строкой в ​​определенных идентификаторах столбцов? - PullRequest
0 голосов
/ 27 марта 2019

Это довольно сложный вопрос, извините заранее!

Я пытаюсь последовательно добавить значения столбцов в один столбец (CURRENT_FIX_DURATION), при этом новый столбец создается со значениями, идущими вверх, но только в пределах указанных строк (как указано в TRIAL_INDEX, 1-160, в пределах идентификатора, 75 отдельных идентификаторов ).

Вот часть моего фрейма данных:

       ID TRIAL_INDEX CURRENT_FIX_DURATION CURRENT_FIX_INDEX
1 bb10jml2           1                  462                 1
2 bb10jml2           1                  166                 2
3 bb10jml2           1                   60                 3
4 bb10jml2           1                  118                 4
5 bb10jml2           1                   60                 5
  CURRENT_FIX_INTEREST_AREA_INDEX
1                               5
2                               3
3                               .
4                               4
5                               .

В каждом столбце CURRENT_FIX_DURATION должно быть добавлено 160 испытаний для каждого и 75 отдельных идентификаторов с различными номерами.

Я хотел бы иметь возможность сложить #s для CURRENT_FIX_DURATION с суммированием, останавливающимся в конце пробного периода, и повторением для следующего пробного периода.

Вот пример вывода того, чего я хотел бы достичь:

CURRENT_FIX_DURATION
462
628
688
806
866

Я бы хотел, чтобы это продолжалось до достижения TRIAL_INDEX 2, а затем началось с начала следующего значения, не суммируемого с предыдущим столбцом CURRENT_FIX_DURATION TRIAL_INDEX.

Возможно ли этого достичь? Хотя я использую для циклов, но я не уверен, с чего начать в кадре данных. В общем, сложность усугубляется тем фактом, что числа, добавляемые для каждого предмета / испытания, являются полностью переменными.

Должен ли я преобразовать это в длинный формат и попробовать с ddply?

Дайте мне знать, что вы думаете, или, если вам нужна дополнительная информация!

Спасибо за ваше время!

1 Ответ

1 голос
/ 28 марта 2019

Вот решение для tidyverse с использованием map2 из пакета purrr.

library(tidyverse)
mydata <- tibble(id = rep("a", 5), trial_index = rep(1, 5),
       current_fix_duration = c(462, 166, 60, 118, 60),
       current_fix_index = 1:5)


newdata <- mydata %>% group_by(id) %>% 
  mutate(current_fix_duration2 = map2_dbl(trial_index, current_fix_index, ~sum(current_fix_duration[.x:.y]))) %>%
as.data.frame()

# A tibble: 5 x 5
# Groups:   id [1]
     id trial_index current_fix_duration current_fix_index current_fix_duration2
  <chr>       <dbl>                <dbl>             <int>                 <dbl>
1     a           1                  462                 1                   462
2     a           1                  166                 2                   628
3     a           1                   60                 3                   688
4     a           1                  118                 4                   806
5     a           1                   60                 5                   866
...