我有这个数据框
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))
}
答案 0 :(得分:1)
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
答案 1 :(得分:1)
您无需解释“数据框的”是否表示“按列”。假设它确实如此,并使用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在这种情况下会提供它们-但是您可以用它们的名字代替。