Заменить NULL в списке на NA - PullRequest
1 голос
/ 20 марта 2020

Я пытаюсь извлечь элементы из списка, заменив NULL на NA. Кажется, что мое простое утверждение ifelse и is.null усекает подсписки до первого элемента Что происходит?

Henry_VIII.list <- list(name="Henry Tudor",DOB=as.Date("28 June 1491", format=("%d %B %Y")),place_of_birth="Palace of Placentia, Greenwich, Kent",
                        DOD=as.Date("28 January 1547", format=("%d %B %Y")),place_of_death="Palace of Whitehall, London")

Catherine_of_Aragon.list <- list(name="Catherine of Aragon",DOB=as.Date("16 December 1485", format=("%d %B %Y")),place_of_birth="Archiepiscopal Palace of Alcalá de Henares, Alcalá de Henares, Castile", DOD=as.Date("7 January 1536", format=("%d %B %Y")),place_of_death="Kimbolton Castle, England")
Anne_Boleyn.list <- list(name="Anne Boleyn", DOB="?? July 1501", place_of_birth="Blickling Hall, Norfolk or Hever Castle, Kent", DOD=as.Date("19 May 1536", format=("%d %B %Y")),place_of_death="Tower of London, London")

Henry_VIII.list$spouse <- list(Catherine_of_Aragon.list,Anne_Boleyn.list)
Emily_Dickinson.list <- list(name="Emily Dickinson",DOB=as.Date("10 December 1830", format=("%d %B %Y")),place_of_birth="Amherst, Massachusetts, US",
                             DOD=as.Date("15 May 1886", format=("%d %B %Y")),place_of_death="Amherst, Massachusetts, US")

biography.list <- list(Henry_VIII.list,Emily_Dickinson.list)
sapply(1:2, function(x) biography.list[[x]]$spouse) ## gets correct results
sapply(1:2, function(x) ifelse(is.null(biography.list[[x]]), NA, biography.list[[x]])) ## kills Anne Boleyn

Ответы [ 2 ]

2 голосов
/ 20 марта 2020

Не думаю, что вы хотите использовать ifelse, вместо этого мы должны использовать оператор if. ifelse хочет вернуть вектор, а не список. Похоже, вы хотите, чтобы список был возвращен.

sapply(1:2, 
       function(x){
           if(is.null(biography.list[[x]]$spouse)){
               NA
           }else{
               biography.list[[x]]$spouse
           }
       })
1 голос
/ 20 марта 2020

Мы также можем сделать назначение

biography.list <- lapply(biography.list, function(x) 
          {x$spouse[is.null(x$spouse)] <- NA;x})
...