首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R-用NA替换特定值内容

问R-用NA替换特定值内容
EN

Stack Overflow用户
提问于 2018-03-24 04:31:14
回答 3查看 13.4K关注 0票数 0

我有一个相当大的数据框,它有多个"-“,表示丢失的数据。数据框由多个Excel文件组成,这些文件不能使用"na.strings =“或其他函数,因此我必须使用"-”表示法导入它们。

如何将数据框中的所有"-“替换为NA /缺失的值?数据框由200列字符、因子和整数组成。

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

代码语言:javascript
复制
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列字符、因子和整数组成,因此我可以理解最后两列不能正常工作的原因。任何帮助都将不胜感激。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-03-24 04:53:15

由于您已经在使用tidyverse函数,因此可以很容易地在管道中使用dplyr中的na_if。

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

代码语言:javascript
复制
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,我可以这样做:

代码语言:javascript
复制
df %>% 
    mutate(val1 = na_if(val1, 999))

在您的示例中,听起来像是要跨多个变量替换一个值,因此使用mutate_at或mutate_if会更合适:

代码语言:javascript
复制
df %>%
    mutate_at(vars(val1, val2), na_if, 999)

将val1和val2中的所有999实例替换为NA,现在看起来如下所示:

代码语言:javascript
复制
# 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.
票数 7
EN

Stack Overflow用户

发布于 2018-03-24 05:21:07

我认为最简单的解决方案是使用基R函数is.na<-。它就是为了解决这个问题。

首先,编造一些数据。然后将所需的值设置为NA。

代码语言:javascript
复制
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
票数 4
EN

Stack Overflow用户

发布于 2018-03-24 04:44:27

这里有一个解决方案可以做到这一点:

代码语言:javascript
复制
> 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  
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49457877

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档