【问题标题】:How to convert character(0) to NA in a list?如何将字符(0)转换为列表中的NA?
【发布时间】:2017-06-26 18:30:48
【问题描述】:

character(0)如何在列表中转换为NA

例子:

a = list("a", character(0), "b", "c")

a = list("a", NA, "b", "c")

【问题讨论】:

  • 点赞:lapply(a, function(x) if (x == 'character(0)') 'NA' else x)??
  • 真的是一个包含短语“character(0)”的字符串吗?
  • 我怀疑你给了我们错误的输入,而你真正想要的更像是:lapply(a, function(x) if (!length(x) && is.character(x)) NA_character_ else x)
  • 或者你的数据更像list("a", character(0), "b", "c")
  • 当然需要注意的是,您应该承认character(0) 通常不同于NA_character_...

标签: r list


【解决方案1】:

仅替换 character(0)(假设您的意思是 character(0) 而不是 "character(0)"):

a = list("a", character(0), "b", "c")

lapply(a, function(x) if(identical(x, character(0))) NA_character_ else x)

#[[1]]
#[1] "a"

#[[2]]
#[1] NA

#[[3]]
#[1] "b"

#[[4]]
#[1] "c"

替换所有长度为0的元素:

a[lengths(a) == 0] <- NA_character_

a
#[[1]]
#[1] "a"

#[[2]]
#[1] NA

#[[3]]
#[1] "b"

#[[4]]
#[1] "c"

【讨论】:

  • 太完美了!谢了!
【解决方案2】:

a[a=="character(0)"] &lt;- "NA"

鉴于您的示例,这提供了您所要求的,但这实际上是您想要的吗?

【讨论】:

    【解决方案3】:

    4 年后,但是...

    由于character(0) 是类字符,建议使用同一个类。

    而不是lapply()purrr::map(),因为列表已经存在,也许purrr::modify() 是最合适的。

    a <- purrr::modify_if(
        a, 
        ~ length(.) == 0, 
        ~ NA_character_
      )
    

    请注意,您可以使用~ NA~ NA_character_ 或其他NA 类型。

    这种方法的好处是您可以按深度 (map_depth)、逻辑条件 (map_if) 或直接在某些元素 (map_at) 更改(映射或修改)列表,并且非常简单阅读。

    请参阅purrr 系列函数来处理列表。 https://purrr.tidyverse.org/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-22
      • 2015-05-09
      • 2020-02-13
      • 2016-01-09
      • 2015-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多