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

问题描述 投票:55回答:6

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

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

r dataframe na
6个回答
77
投票

这个:

df[ df == "foo" ] <- NA

65
投票

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

df <- read.csv("file.csv", na.strings = c("foo", "bar"))

4
投票

另一种选择是is.na<-

is.na(df) <- df == "foo"

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


2
投票

使用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"

如果您需要为多个列执行此操作,则可以从"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

1
投票

这可以用dplyr::mutate_all()replace完成:

library(dplyr)
df <- data_frame(a = c('foo', 2, 3), b = c(1, 'foo', 3), c = c(1,2,'foobar'),  d = c(1, 2, 3))

> df
# A tibble: 3 x 4
     a     b      c     d
  <chr> <chr>  <chr> <dbl>
1   foo     1      1     1
2     2   foo      2     2
3     3     3 foobar     3


df <- mutate_all(df, funs(replace(., .=='foo', NA)))

> df
# A tibble: 3 x 4
      a     b      c     d
  <chr> <chr>  <chr> <dbl>
1  <NA>     1      1     1
2     2  <NA>      2     2
3     3     3 foobar     3

另一个dplyr选项是:

df <- na_if(df, 'foo') 

0
投票

另一种解决方法如下:

for (i in 1:ncol(DF)){
  DF[which(DF[,i]==""),columnIndex]<-"ALL"
  FinalData[which(is.na(FinalData[,columnIndex])),columnIndex]<-"ALL"
}
© www.soinside.com 2019 - 2024. All rights reserved.