2012-06-30 212 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