我有一个相当大的数据框,它有多个"-“,表示丢失的数据。数据框由多个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列字符、因子和整数组成,因此我可以理解最后两列不能正常工作的原因。任何帮助都将不胜感激。
发布于 2018-03-24 04:53:15
由于您已经在使用tidyverse函数,因此可以很容易地在管道中使用dplyr中的na_if。
例如,我有一个数据集,其中999用于填写非答案:
df <- tibble(
alpha = c("a", "b", "c", "d", "e"),
val1 = c(1, 999, 3, 8, 999),
val2 = c(2, 8, 999, 1, 2))如果我想把val1改成999是NA,我可以这样做:
df %>%
mutate(val1 = na_if(val1, 999))在您的示例中,听起来像是要跨多个变量替换一个值,因此使用mutate_at或mutate_if会更合适:
df %>%
mutate_at(vars(val1, val2), na_if, 999)将val1和val2中的所有999实例替换为NA,现在看起来如下所示:
# 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.发布于 2018-03-24 05:21:07
我认为最简单的解决方案是使用基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发布于 2018-03-24 04:44:27
这里有一个解决方案可以做到这一点:
> 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 https://stackoverflow.com/questions/49457877
复制相似问题