很抱歉问这个...这肯定是一个常见问题解答,这是一个愚蠢的问题,但它一直在困扰我。假设我想得到数据帧中每个数字列的方差,例如
df <- data.frame(x=1:5,y=seq(1,50,10))
当然,我试试
var(df)
而不是给我我希望的东西,而不是像
那样 x y
2.5 250
我明白了
x y
x 2.5 25
y 25.0 250
具有对角线的方差和其他位置的协方差。当我查找help(var)并读取“var只是cov的另一个接口”时,这是有意义的。当然,方差是变量与其自身之间的协方差。输出有点令人困惑,但我可以沿着对角线阅读,或者只使用diag(var(df))
,sapply(df, var)
或lapply(df, var)
生成差异,或者在var
上重复调用df$x
{1}}和df$y
。
但为什么呢?方差是一种常规的,基本的描述性统计,仅次于均值。将它应用于数据帧的列不应该完全和完全无关紧要吗?当我只询问差异时,为什么要给我协方差?只是好奇。感谢您对此提出任何意见。
答案 0 :(得分:10)
惯用法是
sapply(df, var)
var
有通过强制转换data.frames
的方法,data.frames
来处理matrix
。
Variance
是常规的基本描述性统计量,协方差和相关性也是如此。它们都是相互关联和有趣的,特别是如果你的目标是使用线性模型。
您可以随时创建自己的功能
Var <- function(x,...){
if(is.data.frame(x)) {
return(sapply(x, var,...))} else { return(var(x,...))}
}
答案 1 :(得分:9)
这在?var
中有记载,即:
Description:
‘var’, ‘cov’ and ‘cor’ compute the variance of ‘x’ and the
covariance or correlation of ‘x’ and ‘y’ if these are vectors. If
‘x’ and ‘y’ are matrices then the covariances (or correlations)
between the columns of ‘x’ and the columns of ‘y’ are computed.
其中,“matrices”文本表示类"matrix"
和"data.frame"
的对象。
var
没有传统意义上的数据帧方法。 var
只需通过as.matrix
将输入数据框强制转换为矩阵,然后在该矩阵上调用cov
。
在回答问题的原因时,我认为方差与协方差的概念密切相关,并保持代码简单R Core为类矩阵对象的协方差编写了单个实现,并将其用于方差因为这是你想从矩阵中获得的最可能的东西。
或更简洁;这就是R Core如何实现这一点。学会与之共存。 : - )
另请注意,R正逐渐远离mean
和sd
等函数对数据框的组件(列)进行操作。如果您要应用任何这些功能,包括var
,您需要拨打以下内容:
apply(foo, 2, mean) ## for matrices
sapply(foo, mean) ## for data frames
或更快的特定替代品
colMeans(foo)
在这种情况下,我怀疑 diag(var(df))
将是获得差异的最有效方式,而不是通过var
系列函数重复调用apply
。 diag(var(df))
不太可能比sapply(df, var)
更快,因为前者必须计算所有协方差和方差。
答案 2 :(得分:1)
你的实际答案已被@GavinSimpson所涵盖。对于var
,您也可以使用:
sd(df)^2
# x y
# 2.5 250.0
通过这样做,您将看到@GavinSimpson对于R“不再使用mean
和sd
等函数对数据框的组件(列)进行操作的意义”。不推荐使用意味着功能可能会因R的即将发生的版本更改而退役,如果您不注意警告并进行适当更改,您的代码可能会中断:
警告讯息: sd()已弃用。 请改用sapply(*,sd)。
所以我们可以使用:
sapply(df,sd)^2
# x y
# 2.5 250.0
这给了我们完全相同的结果。
然而,以这种方式执行它有点愚蠢,因为您在每列上有效地调用(sqrt(var(x, na.rm = na.rm)))^2
!相反,正如@mnel建议的那样,sapply( df , var)
是你应该如何获得每个列向量的方差。