Совокупная «сумма» не имеет значения для факторов в R - PullRequest
0 голосов
/ 04 апреля 2019

Мне нужно объединить одинаковые значения в col2 и col3, поэтому я ожидаю получить SUM в col4 и col5:

df <- data.frame("col1"="a", "col2"=c("mi", "se", "mi", "se", "ty"), 
                 "col3"=c("re", "my", "re", "my", "my"), "col4"=c(1, 2, 3, 4, 5), 
                 "col5"=c(1, 2, 3, 4, 5))
agg <- aggregate(df, by=list(df$col1, df$col2), FUN=sum)

В результате возникает ошибка:

Error in Summary.factor(c(1L, 1L), na.rm = FALSE) : ‘sum’ not meaningful for factors

Мой ожидаемый результат -

  col1 col2 col3 col4 col5
1    a   mi   re    4    4
2    a   se   my    6    6
3    a   ty   my    5    5

Ответы [ 2 ]

0 голосов
/ 04 апреля 2019

Использование dplyr:

agg <- df %>% 
  group_by(col2, col3) %>% 
  summarise(col4 = sum(col4),
            col5 = sum(col5))

#   col2  col3   col4  col5
#   <fct> <fct> <dbl> <dbl>
# 1 mi    re        4     4
# 2 se    my        6     6
# 3 ty    my        5     5

Это то, что вы ищете?

0 голосов
/ 04 апреля 2019

Исключить факторные столбцы путем агрегации по list(col4, col5).

with(df, aggregate(list(col4, col5), by=list(col1, col2, col3), sum))
#   Group.1 Group.2 Group.3 c.1..2..3..4..5. c.1..2..3..4..5..1
# 1       a      se      my                6                  6
# 2       a      ty      my                5                  5
# 3       a      mi      re                4                  4

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

with(df, aggregate(list(col4=col4, col5=col5), by=list(col1=col1, col2=col2, col3=col3), sum))
#   col1 col2 col3 col4 col5
# 1    a   se   my    6    6
# 2    a   ty   my    5    5
# 3    a   mi   re    4    4

Как предложено @ Ронак Шах мы также могли бы сделать

aggregate(cbind(col4, col5) ~ col1 + col2 + col3, df, sum)

Метод list немного быстрее, хотя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...