R: элементы с нулевым значением удаляются при объединении в список

#r #if-statement #null

#r #оператор if #null

Вопрос:

Я пытаюсь с помощью for loop получить шесть элементов из вложенного списка фреймов данных, затем объединить эти элементы в список длиной шесть. Затем rbind выводится список во фрейм данных с шестью столбцами. Я обнаружил, что каждый раз, когда элемент имеет значение NULL, он будет автоматически удален, прежде чем попадет в список.

Ниже приведена усеченная версия кода. Извините, сами данные содержат слишком много уровней списков, и я не знаю, как вставить сюда хорошую их часть.

     ob_dat<-data.frame(a=character(0), b=character(0), c=character(0), d=character(0),e=character(0), f=character(0), stringsAsFactors=FALSE)
    e<-e_previous
    f<-f_previous
    for (k in 1:nrow(dat)){
    a<-dat$id[[k]]
    b<-dat$subject[[k]]
    c<-dat$updated[[k]]
    d<-dat$type[[k]]
    ob_list<-as.list(c(a,b,c,d,e,f))
    ob_list<-lapply(ob_list, function(x) ifelse(x == "NULL", NA, x))
ob_dat<rbind(ob_dat,setNames(ob_list,names(ob_dat)))        
    ob_dat[,1:6]<-apply(ob_dat[,1:6],2,as.character)   
  }
  

Код выполнялся хорошо для всех записей, в которых не было NULL, до тех пор, пока однажды некоторые из элементов, скажем, c и d, не стали нулевыми. Это выдало мне ошибку, подобную приведенной ниже:

 Error in setNames(ob_list, names(ob_dat)) : 
  

атрибут ‘names’ [6] должен иметь ту же длину, что и вектор [4]

По-видимому, нулевые элементы c и d были удалены еще до того, как присоединились к другим элементам в списке ob_list. Я пытался использовать что-то вроде:

 c<-ifelse(c=="NULL",NA,c). I was hoping that using `ifelse` can change all `NULL` to `NA`. However, c was changed into `logical(0)` when c was NULL. 
  

Пожалуйста, помогите. Спасибо.

Комментарии:

1. используйте is.null для получения логического вектора

2. Спасибо! Просто изменил его на: c<-ifelse(is.null(c),NA,c) и это сработало.

3. извините, я не знаю, как повысить ваш ответ в комментарии!

4. Не волнуйтесь, все в порядке.