【问题标题】:Is there a way to replace a character in a vector with a NULL value in R?有没有办法用 R 中的 NULL 值替换向量中的字符?
【发布时间】:2022-01-31 23:06:19
【问题描述】:

有很多页面显示如何将 NULL 值替换为 NA 或特定值,但我没有看到任何显示如何采用其他方式的内容(将值替换为 @987654324 @ 在向量中)。有没有办法做到这一点?这是我的{tidyverse} 尝试的代表:

library(tidyverse)

# character vectors can have null values
c("None", "Some", NULL, "Many", "All")
#> [1] "None" "Some" "Many" "All"

# but is there a way to replace a string in a vector with null?
c("None", "Some", "NULL", "Many", "All") %>%
  str_replace("NULL", NULL)
#> Error: `replacement` must be a character vector

reprex package 创建于 2022-01-31 (v2.0.1)

【问题讨论】:

  • 您不能用 NULL 替换字符串,因为 NULL 的长度为零。在您的第一个示例中,字符向量不包含 NULL 值 - 在您指定 NULL 的地方它不包含任何内容,因为 NULL 从字面上看是什么都没有。有一个函数 as.null() 可以简单地将你给它的任何东西变成一个 NULL。
  • 您的第一条语句本身并不是字符向量。这是一个调用函数c,有5个参数,第三个是NULL,其余的是长度为1的字符向量。 c 忽略 NULL,连接其他所有内容,并返回生成的长度为 4 的字符向量。结果中没有隐藏NULL
  • 如果您来自 SQL,请注意 SQL NULL 与 R NA 相同

标签: r vector replace null stringr


【解决方案1】:

值得记住NULLNA 之间的区别。 NA 值是一个狡猾的值,NULL 是没有任何值的。为了使第二个输出与第一个输出相同,您将拥有与以下内容相同的内容

column <- c("None", "Some", "NULL", "Many", "All")
column <- column[column != "NULL"]

这会创建一个较短的向量,这就是 str_replace 不喜欢它的原因。

【讨论】:

    【解决方案2】:

    字符向量不能包含 NULL,但我们可以通过多种方式解决这个问题。

    1. 将字符向量转换为列表,在这种情况下,NULL 可以是一个元素

       x <- c("None", "Some", "NULL", "Many", "All")
       x_list <- replace(as.list(x), x == "NULL", list(NULL))
      
       str(x_list)
       ## List of 5
       ##  $ : chr "None"
       ##  $ : chr "Some"
       ##  $ : NULL
       ##  $ : chr "Many"
       ##  $ : chr "All"
      
    2. 如果没有零长度字符串,则使用它来表示 NULL。这在 R 提供 nzchar 函数来测试这一点时很常见——它对非零长度的字符串返回 TRUE,否则返回 FALSE。

       x <- c("None", "Some", "NULL", "Many", "All")
       x2 <- replace(x, x == "NULL", "")
      
       x2
       ## [1] "None" "Some" ""     "Many" "All" 
      
       nzchar(x2)
       ## [1]  TRUE  TRUE FALSE  TRUE  TRUE
      
    3. 使用 NA 代替 NULL。

       x <- c("None", "Some", "NULL", "Many", "All")
       replace(x, x == "NULL", NA)
       ## [1] "None" "Some" NA     "Many" "All" 
      
    4. 另一种方法是使用两个向量。一个用于数据,一个用于指示值是否缺失。那么 null 组件中的值可以是任何值。

       x <- c("None", "Some", "NULL", "Many", "All")
       x_null <- c(FALSE, FALSE, TRUE, FALSE, FALSE)
      
    5. 许多包可以处理多种类型的缺失值。 memisc 包为此使用了一个 S4 类 "character.item"

       library(memisc)
      
       xx <- x
       missing.values(xx) <- "NULL"
      
       xx
       ## Item (measurement: nominal, type: character, length = 5) 
       ##
       ## [1:5] None Some *NULL Many All
      
       is.missing(xx)
       ## [1] FALSE FALSE  TRUE FALSE FALSE
      

      naniar 包表示不同类型的缺失值 使用第二列和标记的数据框的一列 包为此使用属性。

      有关其他信息,请参阅Missing Data Task View 也缺少价值包。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-27
      • 2018-04-27
      • 2021-01-04
      • 1970-01-01
      • 1970-01-01
      • 2020-11-10
      • 2022-12-13
      • 1970-01-01
      相关资源
      最近更新 更多