新手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
咦??
提前致谢。 !
答案 0 :(得分:5)
第一个问题是,当您从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()
对数据框的处理方式完全不同。它将每个列视为变量,并通过将每列与每个其他列进行比较来计算方差和协方差矩阵:
# 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
答案 1 :(得分:1)
如果你知道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