2016-11-02 4 views
4

Null 값을 NA로 바꾸는 함수를 작성하려고합니다. 내 열의 요약은 다음과 같습니다.Null을 NA로 변경하는 함수

 a b 
12 210 468 

12 개의 빈 값을 NA로 변경하고 싶습니다. 이 가지고 올이 나는 또한 NA에 널 값을 변경하려면하는 몇 가지 다른 요소의 열이, 그래서 나는 여기에서 몇 가지 물건을 빌려 :

# change nulls to NAs 
nullToNA <- function(df){ 

    # split df into numeric & non-numeric functions 
    a<-df[,sapply(df, is.numeric), drop = FALSE] 
    b<-df[,sapply(df, Negate(is.numeric)), drop = FALSE] 

    # Change empty strings to NA 
    b<-b[lapply(b,function(x) levels(x) <- c(levels(x), NA)),] # add NA level 
    b<-b[lapply(b,function(x) x[x=="",]<- NA),]     # change Null to NA 

    # Put the columns back together 
    d<-cbind(a,b) 
    d[, names(df)] 
} 

을하지만, 나는이납니다 오류 : 나는 대답을 시도

> foo<-nullToNA(bar) 
Error in x[x == "", ] <- NA : incorrect number of subscripts on matrix 
Called from: FUN(X[[i]], ...) 

는 여기에서 찾을 : Replace all 0 values to NA하지만 숫자 값에 내 모든 열을 변경합니다.

+0

왜'x == ""대신에 is.null()'함수가 필요하지 않을까요? 어쩌면 아무것도 찾을 수 없습니다. 당신의 레벨이 무엇을 반환하는지 확인 했습니까? 당신은 귀하의 데이터를 단계별로 귀하의 기능 내부를 확인할 수 있습니다. 함수를 무시하고 데이터를 사용하여 함수 내에서 한 줄씩 이동하십시오. –

+0

[모든 0 값을 NA로 바꾸기] 가능한 복제본 (http://stackoverflow.com/questions/11036989/replace-all-0-values-to-na) – Mateusz1981

답변

5

논리적 기준과 일치하는 필드를 직접 인덱싱 할 수 있습니다. 따라서 다음과 같이 쓸 수 있습니다.

df[is_empty(df)] = NA 

여기에서 is_empty은 비교 대상입니다. df == "" :

df[df == ""] = NA 

그러나이 is.null(df) 작동하지 않습니다, 그리고 1 어쨌든 이상한 것이 있습니다. 하지만 다른 유형의 열에 대해서는 논리를 병합하는 것이 좋습니다! 대신, 개별적으로 처리하십시오. 기본 벡터는 list 경우 그에만 작동하기 때문에


1 당신은 표 안에 NULL가 발생하는 경우는 거의 없을거야. 이 제약 조건을 사용하여 행렬 및 data.frames를 만들 수 있지만 NULL 값이 목록에 포함되어 있기 때문에 은 결코 TRUE이 아닙니다.

+0

'is_empty'는 함수가 아니지만'b [b == ""] = NA'를 사용했습니다. –

+0

@TravisHeeter'is_empty'를 임의의 자리 표시 자로 사용했습니다. –

1

어떻게 막 적어도 간단한 예제에 나를 위해

df[apply(df, 2, function(x) x=="")] = NA 

작품 잘.

+1

(1)' ""≠ "NULL"! (2)'적용'은 필요하지 않습니다. –

+0

(2)와 동의하면, 나는 그것을 복잡하게 만들었습니다 :) 그러나 R 벡터에서도 NULL 값을 가질 수 있습니까? ... 어쨌든 OP의 예제 함수는 빈 문자열을 찾고 있으므로 바꾸고 싶다고 생각했습니다. – juod

+0

분명히 테이블에 'NULL'값을 갖는 것은 거의 없습니다. 기본 (열) 벡터가 '목록'일 경우에만 작동합니다. –

관련 문제