Получить средства подгрупп средств в R

Я новичок в R и не знаю, как заставить R вычислить средства подгруппы средств, которые сами являются средствами подгруппы. Я объясню понятнее.

У меня есть такой фрейм данных:

GROUP WORD WLN
1     1    4
1     1    3
1     1    3
1     2    2
1     2    2
1     2    3
2     3    1
2     3    1
2     3    2
2     4    1
2     4    1
2     4    1
...   ...  ...

но настоящий имеет в общей сложности 5 групп и 25 слов (по 5 слов в каждой группе; каждому слову присвоен номер от 1 до 4 пятью субъектами...).

Мне нужно получить средства WLN для каждого слова, и я могу легко сделать это с помощью цикла и сохранить результаты в векторе; но тогда мне нужен вектор со средствами этих средств по группе, к которой принадлежат слова... Так что мне нужны средства средств слов группы 1, затем группы 2 и т.д... (я не не знаю, ясно ли я выразился).

Как я могу получить это, не делая это одну группу за другой?


person Stefano    schedule 22.09.2013    source источник


Ответы (4)


С базой, используя aggregate

> aggregate(WLN~GROUP+WORD, mean, data=df)
  GROUP WORD      WLN
1     1    1 3.333333
2     1    2 2.333333
3     2    3 1.333333
4     2    4 1.000000

где df — данные @Metrics.

Другой альтернативой является использование summaryBy из пакета doBy.

> library(doBy)
> summaryBy(WLN~GROUP+WORD, FUN=mean, data=df)
  GROUP WORD WLN.mean
1     1    1 3.333333
2     1    2 2.333333
3     2    3 1.333333
4     2    4 1.000000
person Jilber Urbina    schedule 22.09.2013

Предположим, что df - это ваш фрейм данных:

df<-structure(list(GROUP = c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 
2L, 2L, 2L), WORD = c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 4L, 
4L, 4L), WLN = c(4L, 3L, 3L, 2L, 2L, 3L, 1L, 1L, 2L, 1L, 1L, 
1L)), .Names = c("GROUP", "WORD", "WLN"), class = "data.frame", row.names = c(NA, 
-12L))

Решение Plyr

install.packages("plyr")
library(plyr)
ddply(df,.(GROUP,WORD),summarize, meanwln=mean(WLN))
 GROUP WORD  meanwln
1     1    1 3.333333
2     1    2 2.333333
3     2    3 1.333333
4     2    4 1.000000

Решение Data.table:

install.packages("data.table")
library(data.table)
df<-data.table(df)
setkey(df,GROUP,WORD)
df[,list(meanwln=mean(WLN)),by="GROUP,WORD"]

 GROUP WORD  meanwln
1:     1    1 3.333333
2:     1    2 2.333333
3:     2    3 1.333333
4:     2    4 1.000000
person Metrics    schedule 22.09.2013
comment
Спасибо, это хорошо работает для средств слов, тогда, я полагаю, мне придется сделать это снова для средств групп, верно? - person Stefano; 22.09.2013
comment
Нет, это уже дало вам значение слов по группам. Как видите, для первой группы и первого слова среднее значение равно 3,33, для второй группы и первого слова среднее значение равно 2,33 и так далее. - person Metrics; 22.09.2013
comment
Боюсь, это не (единственные) средние значения, которые мне нужны. Разве это не среднее в строке 1 (3.33) среднее значение WLN слова 1? а среднее в строке 2 (2.33) среднее значение WLN слова 2? и так далее (что, как мне кажется, отличается от того, что вы говорите здесь)? - person Stefano; 22.09.2013
comment
Мои извинения. Я читал имена строк. 3,33 — это среднее значение слова WORD1 для группы 1 1, 2,33 — это среднее значение слова2 для группы 1 и так далее. - person Metrics; 22.09.2013
comment
Хорошо, и это нормально, но мне также нужно среднее значение для первой группы (т.е. среднее(meanwl[GROUP==1}) и для второй группы (mean(meanwl[GROUP==2}). Но как я могу получить это автоматически с помощью средства слов?то есть, мне нужны средства слова 1, 2, , 3, 4, n... а затем средства группы 1, 2, 3, 4, n... - person Stefano; 22.09.2013
comment
На самом деле, я заметил, что теперь я могу просто повторно использовать приведенный выше код, чтобы получить средства группы, и все будет хорошо. Большое тебе спасибо. - person Stefano; 22.09.2013
comment
ddply(df,.(GROUP),summarize, meanwln=mean(WLN)) для среднего значения группы и ddply(df,.(WORD),summarize, meanwln=mean(WLN)) для среднего значения WORD - person Metrics; 22.09.2013

с базой:

with(df,tapply(WLN,list(GROUP,WORD),mean))

Изменить:

Если вам также нужны строки и столбцы для таблицы выше, вы можете сделать что-то вроде этого:

x <- with(df,tapply(WLN,list(GROUP,WORD),mean))
addmargins(x, margin = seq_along(dim(x)), FUN = mean, quiet = TRUE)
person beginneR    schedule 22.09.2013
comment
Спасибо за ваш ответ. Я предполагаю, что после использования этого кода мне нужно запустить другой код, чтобы получить среднее значение слов по группам, верно? Я думал, что это можно сделать автоматически. - person Stefano; 22.09.2013

А теперь dplyr еще лучше...

require(dplyr)
tmp <- group_by(df, WORD)
df1 <- summarise(tmp, 
   count = n(), 
   mWLN = mean(WLN, na.rm = TRUE))
df1
person dnatheist    schedule 04.07.2016