用数据框中的NA替换字符值

Rob*_*rto 59 r dataframe na

我有一个数据框,包含(在随机位置)"foo"我要用a替换的字符值(比如说)NA.

在整个数据框架中这样做的最佳方法是什么?

c-u*_*hin 83

这个:

df[ df == "foo" ] <- NA
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果您尝试用"foo"替换NA,则反向(`df [df == NA] ="foo"`)将不起作用; 你需要使用`df [is.na(df)] < - "foo"` (16认同)

JoF*_*wld 66

解决这个问题的一种方法是在首先读取数据时将该字符转换为NA.

df <- read.csv("file.csv", na.strings = c("foo", "bar"))
Run Code Online (Sandbox Code Playgroud)


cam*_*lle 18

使用dplyr::na_if,您可以用 替换特定值NA。在这种情况下,那就是"foo".

library(dplyr)
set.seed(1234)

df <- data.frame(
  id = 1:6,
  x = sample(c("a", "b", "foo"), 6, replace = T),
  y = sample(c("c", "d", "foo"), 6, replace = T),
  z = sample(c("e", "f", "foo"), 6, replace = T),
  stringsAsFactors = F
)
df
#>   id   x   y   z
#> 1  1   a   c   e
#> 2  2   b   c foo
#> 3  3   b   d   e
#> 4  4   b   d foo
#> 5  5 foo foo   e
#> 6  6   b   d   e

na_if(df$x, "foo")
#> [1] "a" "b" "b" "b" NA  "b"
Run Code Online (Sandbox Code Playgroud)

如果您需要对多列执行此操作,则可以"foo"mutate_at.

df %>%
  mutate_at(vars(x, y, z), na_if, "foo")
#>   id    x    y    z
#> 1  1    a    c    e
#> 2  2    b    c <NA>
#> 3  3    b    d    e
#> 4  4    b    d <NA>
#> 5  5 <NA> <NA>    e
#> 6  6    b    d    e
Run Code Online (Sandbox Code Playgroud)


Axe*_*man 6

另一种选择是is.na<-

is.na(df) <- df == "foo"
Run Code Online (Sandbox Code Playgroud)

请注意,它的使用可能看起来有点违反直觉,但它实际上将值分配 给右侧的索引。NAdf

  • 或相同的 `'is.na&lt;-'(df, df=="foo")` (2认同)