Суммируйте определенные строки для каждого столбца

Я уверен, что мою проблему легко решить, к сожалению, я не могу придумать простого решения для себя. Я хочу суммировать определенные строки набора данных для каждого столбца.

Мой набор данных выглядит так:

    GIVN  MICP  GFIP
-2  0.01  0.02  0.01
-1  0.03 -0.01  0.01
0  -0.02 -0.03  0.01
1  -0.04  0.05 -0.02
2   0.01  0.02  0.03

Теперь я хочу, чтобы он суммировался один раз из строки -1 в 1 и из строки -2 в 1 для каждого столбца.

Это должно выглядеть так для -1 до 1:

    GIVN  MICP  GFIP
   -0.03  0.01  0.00

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


person M.Berns    schedule 17.12.2018    source источник
comment
Возможно, вы захотите подумать об использовании colSums с подмножеством ваших данных (например, data[2:4,] для второй, третьей и четвертой строк ваших данных)   -  person p0bs    schedule 17.12.2018
comment
@p0bs спасибо, именно то, что мне было нужно   -  person M.Berns    schedule 17.12.2018
comment
@ М.Бернс Рад это слышать!   -  person p0bs    schedule 17.12.2018
comment
@Sotos даже лучше большое спасибо   -  person M.Berns    schedule 17.12.2018


Ответы (1)


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

Во-первых, вам нужно, чтобы ваши имена строк были числовыми, чтобы вы могли сравнивать диапазоны чисел.

Вы отфильтруете данные для групп идентификаторов; dplyr::between — это служебная функция для определения того, находится ли число в диапазоне, включая конечные точки диапазона. Я добавляю переменную с mutate, чтобы указать, из какой группы поступают данные; если вам это не нужно, вы можете убрать mutate и просто добавить аргумент .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

Создано 17 декабря 2018 г. с помощью пакета reprex (v0.2.1)

person camille    schedule 17.12.2018