Почему функция `` mean`` не работает должным образом с `` group_by%>% summarise`` в среде функций? - PullRequest
1 голос
/ 29 марта 2020

Например:

df <- data.frame("Treatment" = c(rep("A", 2), rep("B", 2)), "Price" = 1:4, "Cost" = 2:5)

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

SummarizeFn <- function(x,y,z) {
                       df1 <- x %>% group_by(Treatment) %>% 
                       summarize(n = n(), Mean = mean(y), SD = sd(y)) %>% 
                       df1$Var = z # add a column to show which variable those statistics belong to. 
                   }
SumPrice <- SummarizeFn(df, df$Price, "Price")

Тем не менее, получаются следующие результаты:

  Treatment     n  Mean    SD Var  
  <fct>     <int> <dbl> <dbl> <chr>
1 A             2   2.5  1.29 Price
2 B             2   2.5  1.29 Price

Они являются средним и средним значением всех наблюдений, но не сгруппированные наблюдения по лечению. В чем здесь проблема?

Если я возьму код из функциональной среды, он будет работать совершенно нормально. Пожалуйста, помогите, спасибо.

Если бы у вас был лучший способ достичь моей цели, это было бы здорово! Спасибо!

Ответы [ 2 ]

1 голос
/ 29 марта 2020

Когда вы используете переменные с $ в dplyr каналах, они не учитывают группировку и работают так, как если бы они применялись ко всему фрейму данных. Кроме того, вы можете использовать {{}} для оценки имен столбцов в функциях.

library(dplyr)

SummarizeFn <- function(x,y,z) {
  x %>% 
    group_by(Treatment) %>% 
    summarize(n = n(), Mean = mean({{y}}), SD = sd({{y}}), Var = z)
}

SummarizeFn(df, Price, "Price")

#  Treatment     n  Mean    SD Var  
#  <fct>     <int> <dbl> <dbl> <chr>
#1 A             2   1.5 0.707 Price
#2 B             2   3.5 0.707 Price
1 голос
/ 29 марта 2020

Это связано с вопросом стандартной оценки. Забавно, я только что написал статью на эту тему . Передать имена строк с помощью dplyr довольно сложно. Если вам нужно это сделать, используйте rlang::sym (или rlang::syms) и !! (или !!!)

Что касается вашей проблемы, я думаю, что data.table предлагает вам краткое решение

dt <- as.data.table(mtcars)
output <- dt[,lapply(.SD, function(d) return(list(.N,mean(d),sd(d)))),
   .SDcols = c("mpg","qsec")]
output[,'stat' := c("observations","mean","sd")]
output

# output
#    mpg     qsec         stat
# 1:       32       32 observations
# 2: 20.09062 17.84875         mean
# 3: 6.026948 1.786943           sd

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...