#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. Не волнуйтесь, все в порядке.