Условная агрегация в R - PullRequest
       11

Условная агрегация в R

0 голосов
/ 22 октября 2019

Рассмотрим следующую матрицу:

d <- data.frame(c("a","a","a","a","b","b","b","b"),c("a1","a1","a2","a2","a1","a1","a2","a2"),"c","d",c(1:8))

Я хочу объединить значения в столбце 5, поэтому я получаю следующий data.frame:

d1 <- data.frame(c("a","a","b","b"),c("a1","a2","a1","a2"),"c","d",c(3,7,11,15))

То есть я хочуагрегировать значения в столбце 5 на основе имен в столбце 2. Итак, я хочу сохранить имена в столбцах 1, 3 и 4 (в этом случае имена в столбцах 3 и 4 совпадают, но в моем случаепеременная).

Как мне это сделать в R?

Ответы [ 2 ]

4 голосов
/ 22 октября 2019

Использование data.table:

Код

require(data.table)
d[, .(unique(V3), unique(V4), sum(V5)), .(V1, V2)]

В частности, синтаксис следует dt[i, j, by]. i объявляет подмножество строк объекта data.table, j объявляет list (сокращение .) операций, которые вы хотите выполнить с этим подмножеством, а by назначает группировку переменных. В вашем случае вы хотите sum V3 через V1 - V2 пар. Кроме того, мы применяем unique() к V4 и V5 для предотвращения дублирования строк.

Результат

   V1 V2 V1 V2 V3
1:  a a1  c  d  3
2:  a a2  c  d  7
3:  b a1  c  d 11
4:  b a2  c  d 15

Данные

d = data.table(V1 = c("a","a","a","a","b","b","b","b"), 
                V2 = c("a1","a1","a2","a2","a1","a1","a2","a2"), 
                V3 = "c", 
                V4 = "d", 
                V5 = c(1:8))
2 голосов
/ 22 октября 2019

Используя tidyverse, вы можете сделать это, сгруппировав данные по переменным id и затем суммировав их в следующих группах:

library(tidyverse)

d %>%
    group_by(v1, v2) %>%
    summarize(v3 = first(v3),
              v4 = first(v4),
              v5 = sum(v5))

Результат:

# A tibble: 4 x 5
# Groups:   v1 [2]
  v1    v2    v3    v4       v5
  <fct> <fct> <fct> <fct> <int>
1 a     a1    c     d         3
2 a     a2    c     d         7
3 b     a1    c     d        11
4 b     a2    c     d        15

Призывы кfirst() - это всего лишь один из способов произвольно получить одно значение для тех столбцов, где значение повторяется.

...