【问题标题】:What happens when var() is applied to a data frame row in R?当 var() 应用于 R 中的数据框行时会发生什么?
【发布时间】:2026-02-13 18:05:03
【问题描述】:

新手 R 问题。很抱歉问:我确定它已被回答,但显然它很难搜索。我已经阅读了 var (variance) 的手册页,但我不明白。检查书籍,网页(好的,只有两本书)。我会等待有人指出我现有的答案....

> df
first second
1     1      3
2     2      5
3     3      7

> df[,2]
[1] 3 5 7

> var(df[,2])
[1] 4

好的,到目前为止,一切都很好。

> df[1,]
  first second
1     1      3
> var(df[1,])
       first second
first     NA     NA
second    NA     NA

嗯??

提前致谢。 !

【问题讨论】:

  • 我没有完整的答案,但我还是会补充一点。 R 认为当你给出行时你正在传递一个类似矩阵的对象,当你传递列时是一个向量。我同意这有点奇怪。如果不使用数据框,而是使用矩阵 R,则效果会更好。

标签: r dataframe variance


【解决方案1】:

第一个问题是,当您从 data.frame 中选择一行时,与选择一列时相比,您获得的对象类别不同:

df = data.frame(first=c(1, 2, 3), second=c(3, 5, 7))

class(df[, 2])
[1] "integer"

class(df[1, ])
[1] "data.frame"

# But you can explicitly convert with as.integer.
var(as.integer(df[1, ]))
# [1] 2

第二个问题是var() 对待 data.frame 的方式完全不同。它将每一列视为变量,并通过将每一列与其他每一列进行比较来计算方差和协方差矩阵:

# Create a data frame with some random data.
dat = data.frame(first=rnorm(20), second=rnorm(20), third=rnorm(20))

var(dat)
#              first     second       third
# first   0.98363062 -0.2453755  0.04255154
# second -0.24537550  1.1177863 -0.16445768
# third   0.04255154 -0.1644577  0.58928970

var(dat$third)
# [1] 0.5892897

cov(dat$first, dat$second)
# [1] -0.2453755

【讨论】:

    【解决方案2】:

    如果您知道一个 data.frame 都是数字的,并且希望它可用于行和列操作,则将其转换为矩阵:

    dat = data.frame(first=rnorm(20), second=rnorm(20), third=rnorm(20))
    dm <- data.matrix(df)
    var(dm[1,])
    #[1] 20.25
    

    (使用 apply() 时也会出现同样的效果 .... 列表结构丢失,所有行都转换为最小公分母。)

    > apply(dat, 1, var)
     [1] 0.45998066 1.51241166 0.13634927 0.49981030 0.04440448 1.21224067 0.28113135 0.57968597
     [9] 0.26102036 0.41999510 1.01237100 0.17304770 0.50572223 1.17825272 1.39342510 2.94125062
    [17] 1.18640684 2.15245595 3.06482195 0.96396008
    

    【讨论】:

    • 谢谢!那太棒了。很奇怪,但我相信它在某些情况下是有道理的。
    最近更新 更多