Установить все векторные элементы в NA в списке векторов - PullRequest
0 голосов
/ 01 января 2019

Как я могу установить все векторные элементы на NA в списке векторов?

По сути, я хотел бы сохранить структуру и имена существующего списка, но очистить все значения, чтобы заполнить их позже.Ниже приведен минимальный пример с парой решений.Я предпочитаю базовые и Tidyverse (особенно PURRR) решения, но могу получить любой подход, который лучше, чем у меня ниже.

my_list <- list(A = c('a' = 1, 'b' = 2, 'c' = 3), B = c('x' = 10, 'y' = 20))
ret_list <- my_list

# Approach 1
for (element_name in names(my_list)) {
  ret_list[[element_name]][] <- NA
}

ret_list
# $A
# a  b  c 
# NA NA NA 
# 
# $B
# x  y 
# NA NA 

# Approach 2    
lapply(my_list, function(x) {x[] <- NA; return(x)})
# $A
# a  b  c 
# NA NA NA 
# 
# $B
# x  y 
# NA NA 

Ответы [ 5 ]

0 голосов
/ 01 января 2019

Если список не ограничен одним уровнем, используйте rapply.

# test data modified from question
my_list2 <- list(list(A = c(a = 1, b = 2, c = 3)), B = c(x = 10, y = 20))

rapply(my_list2, function(x) replace(x, TRUE, NA), how = "list")

, который также можно записать как:

rapply(my_list2, replace, list = TRUE, values = NA, how = "list")
0 голосов
/ 01 января 2019

другая альтернатива с dplyr:

lapply(my_list, function(x) dplyr::na_if(x,x))
0 голосов
/ 01 января 2019

Вы можете использовать функцию is.na<- в цикле lapply.

ret_list <- lapply(my_list, `is.na<-`)
ret_list
#$A
# a  b  c 
#NA NA NA 
#
#$B
# x  y 
#NA NA 
0 голосов
/ 01 января 2019

Другой путь

relist(replace( unlist(my_list), TRUE, NA ), skeleton = my_list)

#$A
# a  b  c 
#NA NA NA 

#$B
# x  y 
#NA NA 
0 голосов
/ 01 января 2019

Вот еще один для числовых векторов:

lapply(my_list, `*`, NA) # Instead of * it could also be +, -, etc.
# $A
#  a  b  c 
# NA NA NA 
#
# $B
#  x  y 
# NA NA 

В общем,

lapply(my_list, replace, TRUE, NA)

и

lapply(ret_list, ifelse, NA, NA)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...