如何在某些列ID中逐行连续求和一列值?

时间:2019-03-27 20:51:04

标签: r for-loop sum plyr calculated-columns

这是一个非常复杂的操作,对不起!

我尝试连续地在一列中添加列值(CURRENT_FIX_DURATION),并创建一个新列,其值递增,但仅在指定的行内(由TRIAL_INDEX指定,在1-160中,在ID中,有75个独立ID) )。

这是我数据框的一部分:

       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                               .

每个试验有160个试验,还有75个独立的ID,并在CURRENT_FIX_DURATION列中添加了不同数量的数字。

我希望能够将CURRENT_FIX_DURATION的#加起来,并且求和在试验结束时停止,并在下一个试验中重复。

以下是我想要实现的示例输出:

CURRENT_FIX_DURATION
462
628
688
806
866

我希望这种情况继续下去,直到达到TRIAL_INDEX 2,然后从下一个值的开头开始,而不是与上一个TRIAL_INDEX的CURRENT_FIX_DURATION列求和。

这有可能实现吗?我虽然使用for循环,但是我不确定在数据帧中从哪里开始。 通常,由于每个受试者/试验要增加的数字完全可变,这一事实使问题更加复杂。

我应该将其转换为长格式并尝试ddply吗?

让我知道您的想法,或者您想了解更多信息!

谢谢您的时间!

1 个答案:

答案 0 :(得分:1)

这是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