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

问题描述 投票:0回答:1

这是一个非常复杂的,提前抱歉!

我正在尝试连续地在一列中添加列值(CURRENT_FIX_DURATION),并创建一个值为up up的新列,但仅在指定的行内(由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添加#s,并在试验结束时停止求和,并重复下一次试验。

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

CURRENT_FIX_DURATION
462
628
688
806
866

我希望这一点继续,直到它达到TRIAL_INDEX 2,然后重新开始,下一个值的开头不与前一个TRIAL_INDEX的CURRENT_FIX_DURATION列相加。

这有可能实现吗?我虽然使用for循环,但我不知道在数据框中从哪里开始。一般而言,每个主题/试验的数字添加完全可变,这一事实加剧了这一困难。

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

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

感谢您的时间!

r for-loop sum plyr calculated-columns
1个回答
1
投票

这是使用来自tidyversepackage的map2purrr内的解决方案。

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
© www.soinside.com 2019 - 2024. All rights reserved.