Невозможно рассчитать среднее значение, используя агрегат для таблицы, результат получен как N / A - PullRequest
2 голосов
/ 12 апреля 2019

В настоящее время используется R для расчета среднего и стандартного отклонения для каждой комбинации пола и генотипа в данной таблице:

id Sex     Genotype  Activity
  1 male    ff        1.884 
  2 male    ff        2.283 
  3 male    fs        2.396 
  4 female  ff        2.838   
  5 male    fs        2.956 
  6 female  ff        4.216 
  7 female  ss        3.620 

Я создал таблицу под названием tabled, используя функцию

tabled <- table(data$Sex, data$Genotype)

Когда я пытаюсь вычислить среднее значение, я пробую следующую функцию:

aggregate(data$Sex ~ data$Genotype, by=list(data$Genotype), FUN=mean)

Я получаю вывод

Group.1 data$Sex
<fctr> <dbl>
ff     NA           
fs     NA           
ss     NA           
3 rows

Что я делаю не так? Спасибо!

Ответы [ 3 ]

1 голос
/ 12 апреля 2019

Используется нотация формулы, а также параметр by. Я думаю, что это избыточно.

Вы также не указываете совокупное значение, из которого вы хотите взять среднее значение, что является причиной ошибки (среднее значение применимо только к числовым значениям).

Для стиля формулы используйте ответ Акруна. Вот решение с параметром «by».

with(data, aggregate(list("Activity"=Activity), by=list("Genotype"=Genotype, "Sex"=Sex), FUN=mean))

1 голос
/ 12 апреля 2019

Мы можем использовать метод формулы. Здесь мы устанавливаем подмножества интересующих столбцов, удаляя первый столбец (data[-1]), определяя столбец, который будет суммироваться, по lhs ~ ('Activity ) and complete the formula with .` (что означает для всех остальных столбцов)

aggregate(Activity ~., data[-1], FUN=mean)
#    Sex Genotype Activity
#1 female       ff   3.5270
#2   male       ff   2.0835
#3   male       fs   2.6760
#4 female       ss   3.6200

В коде ОП смешивается метод формулы с методом data.frame.

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

Вы можете сделать что-то подобное, используя пакет data.table -

> library(data.table)
> setDT(dt)[,mean:=mean(Activity),by=.(Sex,Genotype)]

> dt
   id    Sex Genotype Activity   mean
1:  1   male       ff    1.884 2.0835
2:  2   male       ff    2.283 2.0835
3:  3   male       fs    2.396 2.6760
4:  4 female       ff    2.838 3.5270
5:  5   male       fs    2.956 2.6760
6:  6 female       ff    4.216 3.5270
7:  7 female       ss    3.620 3.6200

OR

> setDT(dt)[,mean(Activity),by=.(Sex,Genotype)]

      Sex    Genotype     V1
1:   male       ff     2.0835
2:   male       fs     2.6760
3: female       ff     3.5270
4: female       ss     3.6200
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...