как суммировать числовые и факторные значения одновременно в R

Я пытаюсь суммировать набор данных, группируя по одному столбцу (F1) и получая среднее значение по другим столбцам, за исключением того, что другие столбцы разделены между числовым и факторным уровнями. Я могу использовать ddply для суммирования числовых значений F2, но не знаю, как сделать то же самое для уровней факторов в F3. Я попытался уловить повторяющийся уровень фактора по группам, но это не сработало.

воспроизводимый пример

library(plyr)
set.seed(37)
df<-data.frame("F1"=rep(LETTERS[1:5],each = 3),
               "F2"= 1:15,
               "F3"= sample(c("Yes","No"), 15, replace=TRUE))
df2 <- ddply(df,~F1,summarise,
                     mF2=mean(F2),
                     mF3=tail(names(sort(table(df$F3))), 1))
> df
   F1 F2  F3
1   A  1  No
2   A  2 Yes
3   A  3  No
4   B  4 Yes
5   B  5  No
6   B  6  No
7   C  7 Yes
8   C  8 Yes
9   C  9 Yes
10  D 10 Yes
11  D 11 Yes
12  D 12  No
13  E 13 Yes
14  E 14 Yes
15  E 15  No
> df2
  F1 mF2 mF3
1  A   2 Yes
2  B   5 Yes
3  C   8 Yes
4  D  11 Yes
5  E  14 Yes

Вместо этого df2 должен выглядеть так:

> df2
  F1 mF2 mF3
1  A   2 No
2  B   5 No
3  C   8 Yes
4  D  11 Yes
5  E  14 Yes

Я бы с удовольствием попробовал использовать dplyr или другой метод, если мне покажут, как это сделать.


person val    schedule 30.11.2016    source источник
comment
Почему вы используете table(df$F3) вместо просто table(F3)? Таким образом, вы делаете это для всего набора данных, а не для подмножества. Вы также можете легко преобразовать свой код plyr в dplyr, выполнив что-то вроде df %>% group_by(F1) %>% summarise(mF2 = mean(F2), mF3 = tail(names(sort(table(F3))), 1))   -  person David Arenburg    schedule 30.11.2016


Ответы (1)


Мы можем использовать аналогичный вариант в dplyr

library(dplyr)
df %>% 
  group_by(F1) %>% 
  summarise(mF2 = mean(F2), mF3 = tail(names(sort(table(F3))),1))
person akrun    schedule 30.11.2016
comment
Это не относится к неожиданному поведению OP. - person David Arenburg; 30.11.2016
comment
@DavidArenburg Я смотрел на I'd keep to try it in dplyr - person akrun; 30.11.2016
comment
@akrun: выплевывает 1 ряд. чего не хватает для того, чтобы он соответствовал выходным данным ddply выше? - person val; 30.11.2016
comment
@val использовать dplyr::summarise(mF2 = mean(.. - person akrun; 30.11.2016
comment
@val это не имеет ничего общего с новыми способами. Если вы не понимаете, что делаете неправильно, как дамп кода поможет вам лучше это понять? - person David Arenburg; 30.11.2016
comment
@DavidArenburg: действительно, пейзаж обычно легче увидеть с горных вершин. - person val; 30.11.2016
comment
@DavidArenburg Я видел ваш комментарий о том, почему это произошло, поэтому я не указал его в своем решении. Как только я опубликовал решение, я обнаружил, что вы обновили решение dplyr - person akrun; 30.11.2016