#r
#r
Вопрос:
Я пытаюсь запустить функцию aggregate SD, но я получаю сообщение об ошибке, которое я не могу разрешить, или же я получаю вывод, который не работает. Я включаю образцы данных — цель состоит в том, чтобы работать с большим набором данных, но я даже не могу заставить агрегатную функцию работать с этими тремя столбцами.
dput(droplevels(controls2[1:20, 1:3]))
structure(list(Experiment = structure(c(1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L), .Label = c("Ceres- Clipping",
"FGI- Defoliation"), class = "factor"), Grain = c(489.9, 698.5,
430.6, 244.9, 476.5, 545.4, 570.2, 463.1, 285.1, 407.6, 244.9,
401.9, 126.3, 179.9, 382.7, 266, 653, 653, 606.6, 606.6), Environment = structure(c(1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L,
2L, 2L, 2L), .Label = c("Morris.1", "St. Paul.1"), class = "factor")), row.names = c(3565L,
3566L, 3567L, 3568L, 3569L, 3570L, 3571L, 3572L, 3573L, 3574L,
3575L, 3576L, 3577L, 3578L, 3579L, 3580L, 2379L, 2380L, 2381L,
2382L), class = "data.frame")
controlSDs <- aggregate(x = controls2, by = list(controls2$Experiment, controls2$Environment), FUN = "sd")
Я получаю сообщение об ошибке:
Error in var(if (is.vector(x) || is.factor(x)) x else as.double(x), na.rm = na.rm) :
Calling var(x) on a factor x is defunct.
Use something like 'all(duplicated(x)[-1L])' to test for a constant vector.
Однако единственный столбец, который я пытаюсь выполнить sd()
, controls2$Grain
, является числовым:
names(controls2)
[1] "Experiment" "Grain" "Environment"
class(controls2$Grain)
[1] "numeric"
Я понимаю controls2$Environment
и controls2$Experiment
это факторы, но я уже запускал эту команду раньше с факторами в by = list()
команде, и она сработала. Я также пробовал следующее:
controlSDs <- aggregate(cbind(Experiment, Environment) ~ Grain, data = controls2, sd)
Которое, однако, не возвращает сообщение об ошибке, значения для controlSDs$Experiment
и controlSDs$Environment
были заменены на 0s и NAs, так что я не могу использовать их для объединения набора данных с фреймом данных средних, вычисленных с использованием аналогичной агрегатной функции.
head(controlSDs)
Grain Experiment Environment
1 0.0 0 0
2 30.0 NA NA
3 44.0 NA NA
4 44.3 NA NA
5 46.0 NA NA
6 48.0 NA NA
Буду признателен за любые советы о том, как заставить эту функцию aggregate SD работать правильно. Я был бы доволен решением, которое просто позволяет мне вычислять SD столбца Grain, но в идеале я мог бы масштабировать это до столбца 100 набора данных, который является полностью числовым, кроме столбцов Environment и Experiment. Я обновил R и R Studio за последние две недели. Я все еще учусь создавать воспроизводимые вопросы, поэтому, пожалуйста, дайте мне знать, могу ли я что-нибудь сделать, чтобы улучшить этот вопрос.
Ответ №1:
Вы ищете это. Когда вы указываете формулу, вам нужно установить числовые переменные слева от ~
:
#Code
controlSDs <- aggregate(data = controls2,Grain~.,
FUN = sd)
Вывод:
controlSDs
Experiment Environment Grain
1 Ceres- Clipping Morris.1 154.67734
2 FGI- Defoliation St. Paul.1 26.78905
Основываясь на ваших попытках, это также может сработать:
#Code2
controlSDs <- aggregate(Grain~Experiment Environment , data = controls2, sd)
Тот же вывод.
Комментарии:
1. Спасибо! Я не могу поверить, что допустил такую простую ошибку в этом синтаксисе. В итоге я ищу controlSDs <- aggregate( . ~ Эксперимент Среда, данные = controls2, sd). Это другой вывод в большем наборе данных — в нем есть только одна запись для каждой комбинации эксперимента и среды, и она проходит через все 100 столбцов.
Ответ №2:
Мы можем использовать dplyr
library(dplyr)
controls2 %>%
group_by(Experiment, Environment) %>%
summarise(Grain = sd(Grain))