我有一个相当大的数据框,有多个" - "代表缺失的数据。数据框由多个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列字符,因子和整数组成,因此我可以看到为什么后两个不能正常工作。任何帮助将不胜感激。
答案 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