Функция, которая вычисляет среднее значение, дисперсию и асимметрию одновременно в кадре данных - PullRequest
2 голосов
/ 08 марта 2019

У меня есть этот фрейм данных

um dois tres
1.2 1.9 0.1
1.2 1.1 2
2.2 1.2 0.4
3.0 1.8 2.6

, и мне нужно вычислить в той же функции среднее значение, дисперсию и асимметрию фрейма данных.У меня есть отдельные функции.Есть предложения?

mean <- function(x){
  sum(x)/length(x)
}

variance <- function(x){
    n <- length(x)
    m <- mean(x)
    (1/(n-1))*sum((x-m)^2)
}

skewness <- function(x) {
  n <- length(x)
  v <- var(x)
  m <- mean(x)
  third.moment <- (1/(n - 2))*sum((x - m)^3)
  third.moment/(var(x)^(3/2))
}

Ответы [ 2 ]

1 голос
/ 08 марта 2019

Вы не объясняете, означает ли «из данных» «по столбцу».Давайте предположим, что это так, и используем tidyr::gather() для изменения данных с широкого на длинный, а затем dplyr::summarise() для расчетов.Предположим, что фрейм данных имеет имя data1 и используется moments::skewness:

library(tidyr)
library(dplyr)
library(moments)

data1 %>%
  gather(Var, Val) %>% 
  group_by(Var) %>% 
  summarise(Mean = mean(Val), 
            Vari = var(Val), 
            Skew = skewness(Val))

# A tibble: 3 x 4
  Var    Mean  Vari   Skew
  <chr> <dbl> <dbl>  <dbl>
1 dois   1.5  0.167 0     
2 tres   1.28 1.48  0.0891
3 um     1.9  0.76  0.390

Если вы хотите значения для всех чисел, а не по столбцу, просто опустите group_by.

Если выВы хотите использовать свою собственную функцию - в этом нет необходимости, поскольку R предоставляет их в этом случае - но вы можете просто заменить их имена.

1 голос
/ 08 марта 2019
dput(data)
structure(list(um = c(1.2, 1.2, 2.2, 3), dois = c(1.9, 1.1, 1.2, 1.8), tres = c(0.1, 2, 0.4, 2.6)), class = "data.frame", row.names = c(NA,-4L))


# to use the function skewnewss install and load the package e1071
library(e1071)
sapply(data, function(x) c(means = mean(x), vars = var(x), skews = skewness(x)))

Выходные данные генерируют необходимые вычисления за один раз для каждого из входных столбцов:

             um      dois       tres
   means 1.9000000 1.5000000 1.27500000
   vars  0.7600000 0.1666667 1.47583333
   skews  0.2535648 0.0000000 0.05788459
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...