Невозможно вычислить среднее значение с помощью aggregate для таблицы, результат получается как N / A

#r

#r

Вопрос:

В настоящее время используется 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
  

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

Комментарии:

1. aggregate(Activity ~., data[-1], FUN=mean)

2. Вы объединяете два стиля aggregate . Версия формулы включает группировку by . Выберите один, а не другой.

3. Какое среднее значение из 4 мужчин и 3 женщин?

Ответ №1:

Мы можем использовать метод формулы. Здесь мы подмножествуем интересующие столбцы, удаляя первый столбец ( 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
  

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

Комментарии:

1. Я рассматривал возможность удаления первой роли ID, я ценю это, это именно тот ответ, который я искал. Что именно делает Activity ~. do в этом случае? Можете ли вы это объяснить?

2. @Janus когда у нас есть n столбцов, и если один из столбцов используется для получения среднего значения, то остальные равны n-1, эти n-1 столбцы являются группирующими переменными, обозначаемыми .

3. альтернативно и более явно: агрегат (активность ~ Пол генотип, данные = данные, УДОВОЛЬСТВИЕ = среднее)

Ответ №2:

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

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

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

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

Комментарии:

1. Обязательно также отправляйте именованные списки для лучших заголовков столбцов, чем Group.# и x : with(data, aggregate(list(Activity=Activity), by=list(Genotype=Genotype, Sex=Sex), FUN=mean))

Ответ №3:

Вы можете сделать что-то подобное с помощью data.table package —

 > 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
  

или

 > 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