如何使用dplyr替换数据框中的字符?

时间:2017-09-21 16:10:07

标签: r dplyr

我有一个数据框,其中一列有" MISSING"值和数值,我想用NA替换。我知道我可以在dplyr之外做,但我想把它保存在dplyr工具链中。

read.csv('data.csv', header=F) %>% 
  select(V1,V4) %>% 
  mutate(V4=replace(V4, "MISSING", "NA")) 

但这是一个错误:

Error in mutate_impl(.data, dots) : 
  Column `V4` must be length 30681 (the number of rows) or one, not 30682

数据

structure(list(V1 = c("01/01/1933", "01/02/1933", "01/03/1933", 
"01/04/1933", "01/05/1933"), V4 = c("MISSING", "MISSING", "MISSING", 
"MISSING", "MISSING")), .Names = c("V1", "V4"), class = c("data.table", 
"data.frame"), row.names = c(NA, -5L), .internal.selfref = <pointer: 0x10280cf78>)

3 个答案:

答案 0 :(得分:5)

dplyr::na_if专为此目的而设计:

library(dplyr)

df <- structure(list(V1 = c("01/01/1933", "01/02/1933", "01/03/1933", "01/04/1933", "01/05/1933"), 
                     V4 = c("MISSING", "MISSING", "MISSING", "MISSING", "MISSING")), 
                .Names = c("V1", "V4"), class = "data.frame", row.names = c(NA, -5L))

df %>% mutate(V4 = na_if(V4, 'MISSING'))
#>           V1   V4
#> 1 01/01/1933 <NA>
#> 2 01/02/1933 <NA>
#> 3 01/03/1933 <NA>
#> 4 01/04/1933 <NA>
#> 5 01/05/1933 <NA>

实际上,最好在导入时处理此任务,例如,使用na.stringsread.csv的{​​{1}}参数或data.table::fread的{​​{1}}参数。

此外,您的数据目前是data.table(可能是因为您使用了na),它有readr::read_csv的语法。如果您要使用fread但要将结果保留为标准data.frame,请在[中设置fread

答案 1 :(得分:3)

您可以在不指定列

的情况下执行此操作
library(dplyr)
df <- df %>% replace(.=="MISSING", NA)

答案 2 :(得分:0)

所以你说在CSV文件的某些字段中出现“MISSING”这个词,你希望用NA值替换它们(不是,这很重要,字符串“NA”)。

为此,我建议read_csv包中的readr函数。它更快,并且有一个na参数,用于设置文件中的字符串NA

readr::read_csv(
"one,two,three
1,MISSING,5
2,,3
text,NA,MISSING", na = c("NA", "MISSING", ""))
#> # A tibble: 3 x 3
#>     one   two three
#>   <chr> <chr> <int>
#> 1     1  <NA>     5
#> 2     2  <NA>     3
#> 3  text  <NA>    NA