#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