2013-06-16 4 views
3

아래 문을 실행 한 후 왜 agenew (데이터 프레임의 두 번째 디스플레이 행 23)에 "4"가 표시됩니까? 대신 "0"을 가져야하는 것 같습니다.R을 사용할 때 NA를 바꿀 때 홀수 값 가져 오기

agenew[is.na(agenew)] <- 4 * sibsp + 3 * parch 

이것은 명령문을 실행하기 전의 데이터 프레임입니다.

age sibsp agenew parch 
1 34.5  0  69  0 
2 47.0  1  98  0 
3 62.0  0 124  0 
4 27.0  0  54  0 
5 22.0  1  48  1 
6 14.0  0  28  0 
7 30.0  0  60  0 
8 26.0  1  56  1 
9 18.0  0  36  0 
10 21.0  2  50  0 
11 NA  0  NA  0 
12 46.0  0  92  0 
13 23.0  1  50  0 
14 63.0  1 130  0 
15 47.0  1  98  0 
16 24.0  1  52  0 
17 35.0  0  70  0 
18 21.0  0  42  0 
19 27.0  1  58  0 
20 45.0  0  90  0 
21 55.0  1 114  0 
22 9.0  0  18  1 
23 NA  0  NA  0 

n이 data.frame 및 m ( m < n) agenewNA입니다 행 수의 행 수하자 문을

> newdf 
    age sibsp agenew parch 
1 34.5  0  69  0 
2 47.0  1  98  0 
3 62.0  0 124  0 
4 27.0  0  54  0 
5 22.0  1  48  1 
6 14.0  0  28  0 
7 30.0  0  60  0 
8 26.0  1  56  1 
9 18.0  0  36  0 
10 21.0  2  50  0 
11 NA  0  0  0 
12 46.0  0  92  0 
13 23.0  1  50  0 
14 63.0  1 130  0 
15 47.0  1  98  0 
16 24.0  1  52  0 
17 35.0  0  70  0 
18 21.0  0  42  0 
19 27.0  1  58  0 
20 45.0  0  90  0 
21 55.0  1 114  0 
22 9.0  0  18  1 
23 NA  0  4  0 
+1

아마도'newdf $ agenew [is.na (newdf $ agenew)] <- 4 * newdf $ sibsp + 3 * newdf $ parch' – haki

답변

5

를 실행 한 후 dataframe입니다. 왼쪽 길이 m 오른쪽 길이 n있는 동안이 있기 때문에

agenew[is.na(agenew)] <- 4 * sibsp + 3 * parch 

을하는 것은 잘못된 것입니다. "4"당신이 행 (23) (두 번째 시간이 agenew NA이다)에 agenew에 교체로 받고는 data.frame이 아닌 23 일의 두 번째 행에 4 * sibsp + 3 * parch의 결과는 ... 즉

당신

agenew[is.na(agenew)] <- (4 * sibsp + 3 * parch)[is.na(agenew)] 

하지만, 예를 들어,이 작업을 수행하는 더 우아한 방법이 있습니다 : 할 의미 것은

agenew <- ifelse(is.na(agenew), 4 * sibsp + 3 * parch, agenew) 

여기에, 모든 벡터 길이 n이가.

참고 : 귀하의 질문에 그랬던 것처럼, 나는이 문장의 모든 당신의 data.frame 내에서 평가되어야한다 부분을 생략하고 (참조 with, within, transform 등), 예 :

df <- transform(df, agenew = ifelse(is.na(agenew), 4 * sibsp + 3 * parch, agenew)) 
+0

당신의 제안을 살펴본 후 ifelse 기능은 나에게 더 나은 접근법처럼 보입니다. 나는 그것을 사용할 것이다. –

+0

R을 사용할 때 다소 어색합니다. newdf를 평가하기 위해 data.frame 함수를 다시 실행했습니다. newdf <- data.frame (age, sibsp, agenew, parch). 당신의 제안은 더 좋아 보인다. 그리고 나는 그것을 미래에 기억하려고 노력할 것이다. 고마워, 워렌 –

관련 문제