Функции в R: как вернуть среднее значение, медиану, стандартное отклонение в пределах одной и той же функции - PullRequest
3 голосов
/ 03 ноября 2019

Как я могу вернуть среднее значение, медиану и стандартное отклонение в пределах одной и той же функции в R? Все, что я могу получить, это последняя часть функции, которая рассчитала стандартное отклонение. Я думал, что, присваив Summarystat (Tail_wags) для b, когда я верну 'b', я получу все три значения. Добавил результат для трех значений, которые мне нужны, вне функции после «b», чтобы увидеть, какие значения должны быть.

Dog_biscuits <- c(0,1,2,3,4,5,6,7,8,9,10) 
Tail_wags <- c(0,0,1,3,8,13,14,12,15,16,14)
dog_wags<-cbind(Dog_biscuits,Tail_wags)
dog_wags

summarystat<- function(x) {
  z1 <- mean(x)
  z2<-median(x)
  z3<-sd(x)
}
b<-summarystat(Tail_wags)
b

b
[1] 6.497552
> mean(Tail_wags)
[1] 8.727273
> median(Tail_wags)
[1] 12
> sd(Tail_wags)
[1] 6.497552

Ответы [ 6 ]

4 голосов
/ 03 ноября 2019

Вы можете вернуть только один объект из функции. Хитрость для достижения того, чего вы хотите, - это вернуть список:

summarystat<- function(x) {
  z1 <- mean(x)
  z2 <- median(x)
  z3 <- sd(x)
  return(list(mean=z1, median=z2, sd=z3))
}
3 голосов
/ 03 ноября 2019

Вы можете комбинировать и возвращать переменные, используя общую функцию c().

summarystat<- function(x) {
  z1 <- mean(x, na.rm = TRUE)
  z2<-median(x, na.rm = TRUE)
  z3<-sd(x,na.rm = TRUE)

  return(c(mean=z1,median=z2,standard_dev=z3))
}
Tail_wags <- c(0,0,1,3,8,13,14,12,15,16,14)
summarystat(Tail_wags)
#     mean       median standard_dev 
# 8.727273    12.000000     6.497552 

1 голос
/ 03 ноября 2019

В качестве альтернативы, вы можете полностью избавиться от функции и использовать что-то вроде pastecs::stat.desc, а затем вычесть нужные значения

Dog_biscuits <- c(0,1,2,3,4,5,6,7,8,9,10) 
Tail_wags <- c(0,0,1,3,8,13,14,12,15,16,14)
dog_wags<-cbind(Dog_biscuits,Tail_wags)

pastecs::stat.desc(Tail_wags)[["mean"]]
# 8.727273

Изучите эту статью для получения дополнительных сводных функций. .

1 голос
/ 03 ноября 2019

Функция и применение:

do.call("rbind", lapply(dog_wags, function(x){

      list(mean_val = mean(x),

      median_val = median(x),

      sd_val = sd(x))

    }

  )

)

Данные:

Dog_biscuits <- c(0,1,2,3,4,5,6,7,8,9,10) 
Tail_wags <- c(0,0,1,3,8,13,14,12,15,16,14)
dog_wags <- data.frame(cbind(Dog_biscuits,Tail_wags))
1 голос
/ 03 ноября 2019

Вы ищете что-то вроде:

summarystat <- function(x) {
  my_list <- list("mean" = mean(x), "median" = median(x), "sd" = sd(x))
  return(my_list) 
}

Использование:

vals <- summarystat(Tail_wags)
> a$mean
> a$sd
> a$median
0 голосов
/ 03 ноября 2019

Несколько иной подход, позволяющий выбрать функции для возврата.


Код:

fooapply <- function(x, functions = c("mean", "median", "sd"), na.rm = T){
  func <- functions
  vec <- c()
  for(i in 1:length(func)){
    if(na.rm == T){
      eval(parse(text = paste0("vec[", i,"]", "<-", func[i], "(x, na.rm = T)")))
    } 
    else{
      eval(parse(text = paste0("vec[", i,"]", "<-", func[i], "(x)")))
    }
  }
  names(vec) <- functions
  return(vec)
}

Результат

Чтобы получить желаемый результат, вы можете просто добавить свой вектор в функцию. По умолчанию функция пропускает NA и вычисляет среднее значение, медиану и sd.

fooapply(Tail_wags)

    mean    median        sd 
 8.727273 12.000000  6.497552 

Кроме того, можно также добавлять или удалять функции или заменять их:

fooapply(Tail_wags, c("mean", "median", "IQR"))

Примечаниечто некоторые из включенных функций сообщат об ошибке, когда NA включены без указания na.rm = T, другие просто сообщат NA как результат. Например, функция mean() будет возвращать NA при расчете для вектора, который включает NA. Напротив, IQR() выдаст ошибку, когда NA включены в вектор и, следовательно, для работы fooapply() требуется оператор na.rm = T (который по умолчанию установлен в TRUE).

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