2012-03-13 5 views
3

이것은 정말 간단한 질문이지만 누군가가 불필요한 코드를 추가로 피할 수 있기를 바랍니다. 나는 간단한 dataframe 있습니다열을 곱할 때 NAs 제거하기

Df.1 <- data.frame(A = c(5,4,7,6,8,4),B = (c(1,5,2,4,9,1)),C=(c(2,3,NA,5,NA,9))) 

내가 그때 원래 dataframe에 cbind 것이다 A, B 및 C의 곱이다 여분의 열을 생산한다 싶지.

그래서, 일반적으로 사용하는 것입니다 :

attach(Df.1) 
D<-A*B*C 

그러나 분명히 NAS는 열 C에있는 곳, 내가 NA 변수 D에 내가 모든 NA 행을 오히려 단지 제외하지 않을 수 이 열의 NA 값을 무시하십시오. (그러면 D의 값은 단순히 A와 B의 곱셈이나 C가 사용 가능한 A * B * C 일 것입니다.)

간단히 말해서 NA를 1로 바꿀 수 있다는 것을 알고 있습니다. 따라서 계산은 변경되지 않고 if 문을 사용합니다. 그러나이 작업을 수행하는 단순한 방법이 무엇인지 모른다고 했습니까?

아이디어가 있으십니까?

+0

방법 'D <약 -'를 사용 if' 주위 부적절한 방법 A * B 형 * (! is.na C * (C) + 1 * is.na (C))'. –

+0

그건 좋겠지 만, @CarlWitthoft 그 코드가 작동하지 않을까 걱정됩니다. –

+0

내 사과 - 지금은 테스트/디버그 할 수 없습니다. 어떤 오류 (또는 나쁜 결과)가 발생했는지 말해 줄 수 있습니까? –

답변

3

na.rm 인수를 갖는 prod을 사용할 수 있습니다. 행 사용 apply하여 작업을 수행하려면 :

apply(Df.1,1,prod,na.rm=TRUE) 
[1] 10 60 14 120 72 36 
+0

그건 정말 재미 있어요 @ 제임스, 나는 전에 '찌르다'를 사용하지 못했습니다 - '1'이 무엇에 사용되는지 물어볼 수 있습니까? 또한 데이터 세트에 다른 열이 있지만 여러 개의 A, B 및 C 만 필요로하는 경우 - 열을 지정하여 해당 제품을 찾고 싶습니다. –

+0

@KatieT 1은'MARGIN' 인수를 통해 행별로 작동하도록'apply' 명령을 내립니다. 컬럼의 수를 제한하기 위해서는'apply'에 사용하고자하는 컬럼만을 넘겨 줄 필요가 있습니다 만, 이것은 인라인으로 할 수 있습니다 :'apply (Df.1 [c ("A", "B", "C")], 1, prod, na.rm = T)' – James

+0

그건 정확히 내가 원했던 것입니다 - 감사합니다 @ 제임스! –

2

으로 @ 제임스는 자극했다 및 작동 적용되지만 별도의 변수에 저장, 또는 그것을

Df.1$D = apply(Df.1, 1, prod, na.rm=T) 
을 cbinding 메모리를 낭비 할 필요가 없습니다

데이터 프레임에 새 변수를 직접 할당하면됩니다.

> Df.1 <- data.frame(A = c(5,4,7,6,8,4),B = (c(1,5,2,4,9,1)),C=(c(2,3,NA,5,NA,9))) 
> Df.1 
    A B C 
1 5 1 2 
2 4 5 3 
3 7 2 NA 
4 6 4 5 
5 8 9 NA 
6 4 1 9 
> Df.1$D = apply(Df.1, 1, prod, na.rm=T) 
> Df.1$D 
[1] 10 60 14 120 72 36 
> Df.1 
    A B C D 
1 5 1 2 10 
2 4 5 3 60 
3 7 2 NA 14 
4 6 4 5 120 
5 8 9 NA 72 
6 4 1 9 36