R - 用 NA 替换特定值内容

Sta*_*cks 0 r missing-data plyr

我有一个相当大的数据框,其中有多个“-”代表丢失的数据。数据框由多个 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
Run Code Online (Sandbox Code Playgroud)

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

cam*_*lle 7

既然你已经使用tidyverse功能,您可以轻松地使用na_ifdplyr您的管道内。

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

df <- tibble(
    alpha = c("a", "b", "c", "d", "e"), 
    val1 = c(1, 999, 3, 8, 999), 
    val2 = c(2, 8, 999, 1, 2))
Run Code Online (Sandbox Code Playgroud)

如果我想改变val1999 是 NA,我可以这样做:

df %>% 
    mutate(val1 = na_if(val1, 999))
Run Code Online (Sandbox Code Playgroud)

在您的情况下,听起来您想跨多个变量替换一个值,因此使用mutate_atormutate_if会更合适:

df %>%
    mutate_at(vars(val1, val2), na_if, 999)
Run Code Online (Sandbox Code Playgroud)

取代999所有实例均val1val2NA现在看起来是这样的:

# A tibble: 5 x 3
  alpha  val1  val2
  <chr> <dbl> <dbl>
1 a        1.    2.
2 b       NA     8.
3 c        3.   NA 
4 d        8.    1.
5 e       NA     2.
Run Code Online (Sandbox Code Playgroud)


Rui*_*das 7

我相信最简单的解决方案是使用基本 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
Run Code Online (Sandbox Code Playgroud)