2016-11-02 1 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

Почему не функция 'is.null()' вместо 'x ==" "'? Может быть, ничего не найти. Вы проверили, возвращает ли ваш 'levels' что-либо. вы можете проверять внутреннюю часть своей функции шаг за шагом с вашими данными. проигнорируйте эту функцию и перейдите по строкам с вашими данными внутри вашей функции. –

+0

Возможный дубликат [Заменить все 0 значений на NA] (http://stackoverflow.com/questions/11036989/replace-all-0-values-to-na) – Mateusz1981

ответ

5

Вы можете напрямую индексировать поля, соответствующие логическому критерию. Таким образом, вы можете просто написать:

df[is_empty(df)] = NA 

is_empty Где ваше сравнение, например, df == "":

Но обратите внимание, что is.null(df) не будет работать, и было бы странно в любом случае . Однако я бы посоветовал не сливать логику для столбцов разных типов! Вместо этого обрабатывайте их отдельно.


Вы практически никогда не сталкиваться с NULL внутри таблицы, так как это работает только если основной вектор является list. Вы можете создать матрицы и data.frames с этим ограничением, но тогда is.null(df) никогда не будет TRUE, потому что значения NULL обернуты внутри списка).

+0

'is_empty' не является функцией, но я использовал' b [b == ""] = NA', и это сработало. –

+0

@TravisHeeter Я использовал 'is_empty' в качестве произвольного заполнителя. –

1

Как насчет:

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

отлично работает для меня, по крайней мере, на простых примерах.

+1

(1) '' '' '' NULL'! (2) 'apply' не требуется. –

+0

Согласитесь с (2), я слишком усложнил это :) Но можете ли вы даже иметь значения NULL в R векторах? .. В любом случае, примерная функция OP ищет пустые строки, поэтому я решил, что это то, что он хотел заменить. – juod

+0

Понятно, что значения «NULL» в таблицах встречаются редко. Он работает только в том случае, если базовый (столбец) вектор является «списком». –