R - 用NA替换特定值内容

时间:2018-03-23 20:31:14

标签: r plyr missing-data

我有一个相当大的数据框,有多个" - "代表缺失的数据。数据框由多个Excel文件组成,这些文件无法使用" na.strings ="或替代功能,所以我不得不用" - "表示。

如何更换所有" - "在NA /缺失值的数据框中?数据框由200列字符,因子和整数组成。

到目前为止,我已经尝试过:

sum(df %in c("-"))
returns: [1] 0

df[df=="-"] <-NA #does not do anything

library(plyr)
df <- revalue(df, c("-",NA))
returns: Error in revalue(tmp, c("-", NA)) : 
  x is not a factor or a character vector.

library(anchors)
df <- replace.value(df,colnames(df),"-",as.character(NA))
Error in charToDate(x) : 
  character string is not in a standard unambiguous format

数据框由200列字符,因子和整数组成,因此我可以看到为什么后两个不能正常工作。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:3)

由于您已经在使用tidyverse功能,因此您可以轻松地在管道中使用bar.toBeIgnored中的na_if

例如,我有一个数据集,其中999用于填写非答案:

dplyr

如果我想更改df <- tibble( alpha = c("a", "b", "c", "d", "e"), val1 = c(1, 999, 3, 8, 999), val2 = c(2, 8, 999, 1, 2)) 所以999是NA,我可以这样做:

val1

在您的情况下,听起来您想要在多个变量中替换值,因此使用df %>% mutate(val1 = na_if(val1, 999)) mutate_at会更合适:

mutate_if

df %>% mutate_at(vars(val1, val2), na_if, 999) val1中的所有999实例替换为val2,现在看起来像这样:

NA

答案 1 :(得分:1)

这是一个可以做到的解决方案:

> library(dplyr)
> test <- tibble(x = c('100', '20.56', '0.003', '-', '  -'),  y = 5:1)
> makeNA <- function(x) str_replace(x,'-',NA_character_)
> mutate_all(test, funs(makeNA))
# A tibble: 5 x 2
  x     y    
  <chr> <chr>
1 100   5    
2 20.56 4    
3 0.003 3    
4 NA    2    
5 NA    1  

答案 2 :(得分:1)

我认为最简单的解决方案是使用基本R函数is.na<-。它的意思是准确地解决这个问题。

首先,补充一些数据。然后将所需值设置为NA

set.seed(247)    # make the results reproducible

df <- data.frame(X = 1:10, Y = sample(c("-", letters[1:2]), 10, TRUE))

is.na(df) <- df == "-"
df
#    X    Y
#1   1    a
#2   2    b
#3   3    b
#4   4    a
#5   5 <NA>
#6   6    b
#7   7    a
#8   8 <NA>
#9   9    b
#10 10    a