Суммируйте определенные строки для каждого столбца - PullRequest
0 голосов
/ 17 декабря 2018

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

Мой набор данных выглядит следующим образом:

    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 я добавляю только все строки из каждого столбца, чтоэто не то, что я хочу сделать.

1 Ответ

0 голосов
/ 18 декабря 2018

Это вариант с 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)

...