2012-07-18 3 views
1

난처한 오류가 발생했습니다. 내가 예를 들면 재현 예는,R 적용 오류 - as.matrix.data.frame()의 오류

##### removes NA'd rows from a dataFrame 
wipeNArows<-function(X){ 
    rowsToDelete<-unique(unlist(apply(apply(X,2,is.na),2,which))) 
    if (length(rowsToDelete)>0){ 
    return (X[-rowsToDelete,]) 
    } 
    else{ 
    return (X) 
    } 
} 

이 기능은 일반적으로 잘 동작 모든 열에서 NA 관찰 함유 dataframe 행을 삭제 다음 함수를 사용하고 :

testFrame<-data.frame(x=rpois(20,10),y=rpois(20,10),z=rpois(20,10)) 
rowsToDelete<-sample(1:nrow(testFrame),5,FALSE) 
testFrame$x[rowsToDelete]<-NA 
testFrame 
wipeNArows(testFrame) ### removes the rows where NA is encountered 

지금 가지고 약 2993 개의 행을 포함하는 데이터 프레임 나는 내가 다음과 같은 오류에 직면 기능을 통해 데이터 프레임을 전달하는 경우 : 나를 위해 응답을

Error in apply(apply(X, 2, is.na), 2, which) : 
error in evaluating the argument 'X' in selecting a method for function 'apply': Error in as.matrix.data.frame(X) : 
dims [product 14965] do not match the length of object [14974] 

감사합니다,

+1

* * * 대신 * 작동하지 않는 예제를 제공 할 수 있습니까? – A5C1D2H2I1M1N2O1R2T1

+0

함수 시작 부분에'browser()'를 삽입하는 것이 좋습니다. 그렇게하면 코드를 단계별로 실행하여 각 요소를 검사하고 버그를 찾아 낼 수 있습니다. –

답변

4

당신은 당신의 데이터의 노나가없는 경우, na.omit

na.omit(testFrame) 

    x y z 
2 7 11 11 
3 12 10 10 
4 13 10 9 
6 11 10 12 
7 13 14 8 
8 7 9 7 
9 8 11 12 
10 5 10 7 
11 5 15 9 
12 7 13 9 
15 15 8 9 
16 13 7 15 
17 5 10 12 
18 9 8 6 
20 18 7 6 
+0

멋지다. 재연이 필요하지 않습니다. –

8

작품 좋은,하지만 왜 문제없이 ?complete.cases

testFrame[complete.cases(testFrame),] 
    x y z 
2 10 8 13 
3 11 16 18 
4 11 7 7 
6 8 8 14 
7 9 11 11 
8 12 11 5 
9 10 7 4 
10 7 12 9 
11 10 13 11 
12 9 12 10 
13 10 5 8 
14 13 5 8 
15 11 5 5 
18 13 14 7 
19 2 13 8 

identical(testFrame[complete.cases(testFrame),], wipeNArows(testFrame)) 
[1] TRUE 
+0

+1 - 분명한 접근! – mnel

0

를 사용 데이터, 나는 단지 다른 기능을 제안 할 수있다.

wipe_na_rows <- function(X){ 
    X[!apply(X, 1, function(x) any(is.na(x))),] 
} 
4

hmm th 답장을 요청할 때 은 complete.cases 함수를 인식하지 못했습니다. > 방법으로이 문제를 해결하기 위해 나타납니다 -하지만

Error in complete.cases(dFrame) : not all arguments have the same length 

chisq.test Error Message 다른 오류를 제공합니다.

문제가있는 데이터 프레임의 문제는 날짜가있는 POSIXlt 개체 열이 포함되어 있다는 것입니다. 명확하게 완료합니다. 내부 작업을 적용하면이 작업을 너무 잘 처리하지 못합니다. 해결 방법은 strftime을 사용하여 문자로 캐스팅 한 다음 strptime을 사용하여 다시 캐스팅하는 것입니다. 아 디트 Sihag가 제안

덕분에,

1

일반적인 경우 일 것이다 당신의 문제를 해결하는 또 다른 방법은, 다음, 문제가 하나가 될 수 data.frame 열의 데이터 유형은 목록 또는 POSIXlt 객체와 같은 객체 목록 일 수 있습니다. 그것들을 캐스팅 할 수도 있고 아니면 단지 열에 lapply를 사용할 수도 있습니다. 그러나 lapply를 적용하기 전에 컬럼 데이터 타입이리스트 나 POSIXlt가 아닌지 다시 확인하십시오. 그렇다면 그냥 캐스팅하십시오.