2012-06-30 76 views
2

新手R第。对不起,问:我确信它已经得到解答,但显然这是一个很难搜索的问题。我已阅读var(方差)的手册页,但我不明白。检查书籍,网页(好吧,只有两本书)。我会等待有人指点我现有的答案....会发生什么?

> 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

我没有一个完整的答案,但不适增添几分呢。 R认为你在传递行时传递一个像对象一样的矩阵,当你传递给列时传递一个向量。 我同意这是一个有点怪异。如果不使用数据帧,而是使用矩阵R,则会更好一些。 – Seth

回答

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

如果你知道一个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(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..17304770 0.50572223 1.17825272 1.39342510 2.94125062 
[17] 1.18640684 2.15245595 3.06482195 0.96396008 
+0

谢谢!那很棒。奇怪,但我相信它在某些情况下是合理的。 – Mars