Это вариант с dplyr
, но он немного неуклюжий.Сложность заключается в том, что вы не аккуратно разбиваете ID на взаимоисключающие группы, поэтому вам нужно работать с по существу отдельными фреймами данных, а затем связывать их вместе.
Сначала вам нужно указать имена строк, чтобыбыть числовым, чтобы вы могли сравнить диапазоны номеров.
Вы будете фильтровать данные по группам идентификаторов;dplyr::between
- это служебная функция для определения, находится ли число в диапазоне, включая конечные точки диапазона.Я добавляю переменную с mutate
, чтобы указать, из какой группы поступают данные;если вам это не нужно, вы можете удалить mutate
s и просто добавить аргумент .id
в bind_rows
.Вам просто понадобится какой-то способ дифференцирования групп, когда вы будете суммировать.
Это происходит внутри вызова bind_rows
, который похож на rbind
, но может принимать более 2 кадров данных одновременно.Тогда group_by
и подведем итоги.Если у вас слишком много столбцов и присвоение им имен в summarise_at
становится громоздким, вы можете вместо этого сбросить идентификатор и использовать summarise_all
или summarise_if
.
library(dplyr)
df$id <- as.numeric(row.names(df))
bind_rows(
df %>% filter(between(id, -1, 1)) %>% mutate(group = "-1 to 1"),
df %>% filter(between(id, -2, 1)) %>% mutate(group = "-2 to 1")
) %>%
group_by(group) %>%
summarise_at(vars(GIVN:GFIP), sum)
#> # A tibble: 2 x 4
#> group GIVN MICP GFIP
#> <chr> <dbl> <dbl> <dbl>
#> 1 -1 to 1 -0.03 0.01 0
#> 2 -2 to 1 -0.02 0.03 0.01
Создано в 2018-12-17 представлением пакета (v0.2.1)