R:对一列数据帧的每n行求和

时间:2018-08-14 20:21:51

标签: r sum tidyverse

我希望对数据帧(数据)的一列中的每5行数据求和,以显示第6行中前5行的总和(请参见下表)。我已经尝试了以下dplyr,该dplyr以向量的形式返回总体行rate2列中所有总计值的总和。

data$rate2<-
  ifelse(data$age!="Overall", data$rate,
  ifelse(data$age=="Overall",
       data %>%
       group_by(data$state,data$year)%>%
       summarise_at(vars(rate),
                     sum, na.rm=TRUE),
 ifelse(data$age,is.na(), NA)))

此代码返回以下结果:

State    Age         Year    rate     rate2
GA        5          2015     .4        .4
GA        6          2015     .4        .4
GA        7          2015     .5        .5
GA        8          2015     .2        .2
GA        9          2015     .3        .3
GA        Overall    2015              c(1.8,7.5)
GA        5          2016     1.0      1.0
GA        6          2016     2.0      2.0
GA        7          2016      .5       .5
GA        8          2016     1.0      1.0
GA        9          2016     3.0      3.0
GA        Overall    2016              c(1.8,7.5) 

是否有一种方法可以在rate2列中为“总体”行计算单个值。我不确定通过使用循环是否可以更好地实现这一点。为了清楚起见,我需要能够使用rate2列的“总体”行中的值来为另一列执行后续计算。

State    Age         Year    rate     rate2
GA        5          2015     .4        .4
GA        6          2015     .4        .4
GA        7          2015     .5        .5
GA        8          2015     .2        .2
GA        9          2015     .3        .3
GA        Overall    2015              1.8
GA        5          2016     1.0      1.0
GA        6          2016     2.0      2.0
GA        7          2016      .5       .5
GA        8          2016     1.0      1.0
GA        9          2016     3.0      3.0
GA        Overall    2016              7.5 

任何帮助将不胜感激!预先谢谢你!

1 个答案:

答案 0 :(得分:1)

似乎是一种奇怪的数据结构。但是,如果我正确理解它,则需要获取每年的“总体”值以执行一些后续任务,然后使用一个假定的数据框:

library(data.table)
library(tidyverse)

data <- fread ("
           State    Age         Year    rate     rate2
           GA        5          2015     .4        .4
           GA        6          2015     .4        .4
           GA        7          2015     .5        .5
           GA        8          2015     .2        .2
           GA        9          2015     .3        .3
           GA        Overall    2015     NA       NA
           GA        5          2016     1.0      1.0
           GA        6          2016     2.0      2.0
           GA        7          2016      .5       .5
           GA        8          2016     1.0      1.0
           GA        9          2016     3.0      3.0
           GA        Overall    2016     NA       NA 
           ")

data %>% 
  filter(Age != "Overall") %>% 
  group_by(Year) %>% 
  summarize(Overall = sum(rate2, na.rm = T))