有没有办法用 R 中的 NULL 值替换向量中的字符?

Is there a way to replace a character in a vector with a NULL value in R?

有很多页面展示了如何将 NULL 值替换为 NA 或特定值,但我还没有看到任何展示如何进行相反操作的内容(用向量中的 NULL 替换一个值)。有没有办法做到这一点?这是我的 {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 (v2.0.1)

创建于 2022-01-31

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

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

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

字符向量不能包含 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 函数来对此进行测试——对于 non-zero 长度的字符串 returns 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. 另一种方法是使用两个向量。一个用于数据,一个用于指示值是否缺失。那么空组件中的值可以是任何值。

     x <- c("None", "Some", "NULL", "Many", "All")
     x_null <- c(FALSE, FALSE, TRUE, FALSE, FALSE)
    
  5. 许多包可以处理多种类型的缺失值。 memisc 包为此使用 S4 class、"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 还缺少价值包。