【问题标题】:Set all vector elements to NA in a list of vectors将向量列表中的所有向量元素设置为 NA
【发布时间】:2019-05-28 06:06:27
【问题描述】:

如何在向量列表中将所有向量元素设置为 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 

【问题讨论】:

  • 这两种方法对我来说都很好(特别是如果您事先在方法 2 中定义函数而不是匿名内联)。为什么要尝试比这更聪明?您想弥补哪些具体的缺点?
  • 只是借此机会更好地了解 R。在我看来,这是一个如此普遍的操作,必须有一个标准的最佳实践方法。

标签: r


【解决方案1】:

这是另一个数值向量:

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)

【讨论】:

  • 在这种情况下* 被称为什么?
  • @YOLO,我不确定你的意思。第一种方法与lapply(my_list, function(x) x * NA)相同,所以*是通常的乘积,当其中一个因素为NA时,结果为NA
【解决方案2】:

如果列表不限于一级,则使用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")

【讨论】:

    【解决方案3】:

    dplyr 的另一种选择:

    lapply(my_list, function(x) dplyr::na_if(x,x))
    

    【讨论】:

      【解决方案4】:

      另一种方式

      relist(replace( unlist(my_list), TRUE, NA ), skeleton = my_list)
      
      #$A
      # a  b  c 
      #NA NA NA 
      
      #$B
      # x  y 
      #NA NA 
      

      【讨论】:

        【解决方案5】:

        您可以在lapply 循环中使用函数is.na&lt;-

        ret_list <- lapply(my_list, `is.na<-`)
        ret_list
        #$A
        # a  b  c 
        #NA NA NA 
        #
        #$B
        # x  y 
        #NA NA 
        

        【讨论】:

          猜你喜欢
          • 2018-10-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-09-18
          • 1970-01-01
          • 2017-04-01
          • 2021-06-30
          相关资源
          最近更新 更多