2014-01-19 3 views
4

У меня есть функция, которую я применяю к столбцу и помещаю результаты в другой столбец, и иногда он дает мне integer(0) в качестве вывода. Так что мой выходной столбец будет что-то вроде:Замените integer (0) на NA

45 
64 
integer(0) 
78 

Как я могу обнаружить эти integer(0) «S и заменить их NA? Есть что-то вроде is.na(), которое их обнаружит?


Edit: Хорошо, я думаю, что у меня есть воспроизводимый пример:

df1 <-data.frame(c("267119002","257051033",NA,"267098003","267099020","267047006")) 
names(df1)[1]<-"ID" 

df2 <-data.frame(c("257051033","267098003","267119002","267047006","267099020")) 
names(df2)[1]<-"ID" 
df2$vals <-c(11,22,33,44,55) 

fetcher <-function(x){ 
    y <- df2$vals[which(match(df2$ID,x)==TRUE)] 
return(y) 
} 

sapply(df1$ID,function(x) fetcher(x)) 

Выход из этого sapply является источником проблемы.

> str(sapply(df1$ID,function(x) fetcher(x))) 
List of 6 
$ : num 33 
$ : num 11 
$ : num(0) 
$ : num 22 
$ : num 55 
$ : num 44 

Я не хочу, чтобы это список - Я хочу, чтобы вектор, и вместо num(0) я хочу NA (примечания в этих игрушечных данных дает num(0) - в моих реальных данных это дает (integer(0)).

+2

будет data.frame $ column [data.frame $ column == integer (0)] <- NA work? – cianius

+1

@pepsimax почему бы вам не сказать это как ответ (может быть, рабочий пример)? –

+2

Кадр данных не может содержать 'integer (0)'. Просьба привести воспроизводимый пример. –

ответ

5

Вот способ (а) заменить integer(0) с NA и (б) преобразование списка в вектор.

# a regular data frame 
> dat <- data.frame(x = 1:4) 
# add a list including integer(0) as a column 
> dat$col <- list(45, 
+     64, 
+     integer(0), 
+     78) 
> str(dat) 
'data.frame': 4 obs. of 2 variables: 
$ x : int 1 2 3 4 
$ col:List of 4 
    ..$ : num 45 
    ..$ : num 64 
    ..$ : int 
    ..$ : num 78 
# find zero-length values 
> idx <- !(sapply(dat$col, length)) 
# replace these values with NA 
> dat$col[idx] <- NA 
# transform list to vector 
> dat$col <- unlist(dat$col) 
# now the data frame contains vector columns only 
> str(dat) 
'data.frame': 4 obs. of 2 variables: 
$ x : int 1 2 3 4 
$ col: num 45 64 NA 78 
+0

Спасибо Свен! Это определило мою проблему, включив ее в мою функцию! Большое спасибо всем - извиняюсь за бедный оригинальный вопрос! – user2498193

4

Лучше всего это сделать в вашей функции, я назову ее myFunctionForApply, но это ваша текущая функция. Перед тем, как вернуться, проверьте длину и если это 0 возвращение NA:

myFunctionForApply <- function(x, ...) { 
    # Do your processing 
    # Let's say it ends up in variable 'ret': 
    if (length(ret) == 0) 
     return(NA) 
    return(ret) 
} 
+1

Исправить. Весьма не идиоматический код: 'function (x, ...) if (length (ret) == 0) NA else ret' –

+0

Спасибо, Бен и Конрад! Цените свои ответы! – user2498193

+0

Thanks Calimo Я понимаю, теперь вы ответили и Бен отредактировал – user2498193

Смежные вопросы