2012-06-30 4 views
2

초보자 질문입니다. 유감스럽게도 묻습니다. 답변을 받았음을 확신하지만, 검색하기가 어렵습니다. var (분산)에 대한 man 페이지를 읽었지만 이해하지 못합니다. 확인 된 책, 웹 페이지 (OK, 두 권의 책). 나는 누군가가 기존 대답을 가르쳐주기를 기다릴 것입니다. ...var()가 R의 데이터 프레임 행에 적용되면 어떻게됩니까?

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

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

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

OK, 지금까지 그렇게 좋았습니다.

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

hh?

미리 감사드립니다. !

+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() 취급 데이터가 .frame은 완전히 다르게 작동합니다. 그것은 변수로 각 열을 취급하고 다른 모든 컬럼에 각 열을 비교하여 분산과 공분산의 행렬을 계산 :

당신이 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 
1

및 열 작업은 다음 행렬로 변환 :

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

관련 문제