Как разрешить сообщение об ошибке в функции aggregate SD?

#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))