首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用字符串替换NA值

用字符串替换NA值
EN

Stack Overflow用户
提问于 2019-10-24 20:52:59
回答 3查看 283关注 0票数 2

我的数据如下:

代码语言:javascript
复制
   var1 var2 var3
1    9V  .6V  77V
2    6V  .3V  15V
3    9V  .7V 114V
4   12V 1.0V 199V
5   14V 1.2V 245V
6   13V  .8V 158V
7   11V  .6V 136V
8   11V  .7V 132V
9   12V  .8V 171V
10  11V  .7V 155V
11  13V  .8V 166V
12  11V  .7V 138V
13  11V  .9V 173V
14   9V  .8V 143V
15   8V  .7V 105V
16   4V  .4V  21V
17   8V  .4V  26V
18  10V  .8V 154V
19   9V  .8V 130V
20  10V  .7V 113V
21  10V  .6V 102V
22  11V  .8V 135V
23   9V  .7V 120V
24  10V  .7V 126V
25   7N  .6N 124N
26  14N 1.1N 210N

最后2行包含N。我试图将这些包含N的观测结果设为NA。

我正在尝试一些str_detectstr_replace的组合,但我似乎无法让它发挥作用。

此外,我还有其他字母(非常罕见),即MP -我想找到一种方法来设置如果观察包含这些字母之一,然后将观察设置为NA。即c(var1:var3) %in% str_detect(c("N", "M", "P")). str_replace_all.

数据:

代码语言:javascript
复制
    structure(list(var1 = c("9V", "6V", "9V", "12V", "14V", "13V", 
"11V", "11V", "12V", "11V", "13V", "11V", "11V", "9V", "8V", 
"4V", "8V", "10V", "9V", "10V", "10V", "11V", "9V", "10V", "7N", 
"14N", "7V", "5V", "7V", "9V", "8V", "8V", "5V", "4V", "4V", 
"5V", "7V", "5V", "6V", "8V", "9V", "6V", "6V", "7V", "8V", "7V", 
"8V", "8V", "7V", "8V"), var2 = c(".6V", ".3V", ".7V", "1.0V", 
"1.2V", ".8V", ".6V", ".7V", ".8V", ".7V", ".8V", ".7V", ".9V", 
".8V", ".7V", ".4V", ".4V", ".8V", ".8V", ".7V", ".6V", ".8V", 
".7V", ".7V", ".6N", "1.1N", ".4V", ".3V", ".4V", ".6V", ".5V", 
".6V", ".4V", ".3V", ".2V", ".3V", ".4V", ".3V", ".3V", ".5V", 
".6V", ".4V", ".4V", ".4V", ".5V", ".4V", ".4V", ".5V", ".4V", 
".4V"), var3 = c("77V", "15V", "114V", "199V", "245V", "158V", 
"136V", "132V", "171V", "155V", "166V", "138V", "173V", "143V", 
"105V", "21V", "26V", "154V", "130V", "113V", "102V", "135V", 
"120V", "126V", "124N", "210N", "35V", "9V", "48V", "91V", "81V", 
"80V", "14V", "11V", "7V", "13V", "34V", "18V", "15V", "58V", 
"76V", "29V", "30V", "31V", "32V", "34V", "57V", "58V", "52V", 
"49V")), row.names = c(NA, 50L), class = "data.frame")
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-10-24 21:03:14

你只需要将你的模式更改为“N-M

代码语言:javascript
复制
dat <- structure(list(var1 = c("9V", "6V", "9V", "12V", "14V", "13V", 
                        "11V", "11V", "12V", "11V", "13V", "11V", "11V", "9V", "8V", 
                        "4V", "8V", "10V", "9V", "10V", "10V", "11V", "9V", "10V", "7N", 
                        "14N", "7V", "5V", "7V", "9V", "8V", "8V", "5V", "4V", "4V", 
                        "5V", "7V", "5V", "6V", "8V", "9V", "6V", "6V", "7V", "8V", "7V", 
                        "8V", "8V", "7V", "8V"), var2 = c(".6V", ".3V", ".7V", "1.0V", 
                                                          "1.2V", ".8V", ".6V", ".7V", ".8V", ".7V", ".8V", ".7V", ".9V", 
                                                          ".8V", ".7V", ".4V", ".4V", ".8V", ".8V", ".7V", ".6V", ".8V", 
                                                          ".7V", ".7V", ".6N", "1.1N", ".4V", ".3V", ".4V", ".6V", ".5V", 
                                                          ".6V", ".4V", ".3V", ".2V", ".3V", ".4V", ".3V", ".3V", ".5V", 
                                                          ".6V", ".4V", ".4V", ".4V", ".5V", ".4V", ".4V", ".5V", ".4V", 
                                                          ".4V"), var3 = c("77V", "15V", "114V", "199V", "245V", "158V", 
                                                                           "136V", "132V", "171V", "155V", "166V", "138V", "173V", "143V", 
                                                                           "105V", "21V", "26V", "154V", "130V", "113V", "102V", "135V", 
                                                                           "120V", "126V", "124N", "210N", "35V", "9V", "48V", "91V", "81V", 
                                                                           "80V", "14V", "11V", "7V", "13V", "34V", "18V", "15V", "58V", 
                                                                           "76V", "29V", "30V", "31V", "32V", "34V", "57V", "58V", "52V", 
                                                                           "49V")), row.names = c(NA, 50L), class = "data.frame")


library(stringr)
library(dplyr)
dat %>% mutate(var3 = str_replace_all(var3, c("N|M|P"), replacement = NA_character_))
票数 1
EN

Stack Overflow用户

发布于 2019-10-24 20:56:07

这里有一个解决方案:

代码语言:javascript
复制
x[] <- lapply(x, function(s) ifelse(grepl("N$", s), NA_character_, s))
x
#    var1 var2 var3
# 1    9V  .6V  77V
# 2    6V  .3V  15V
# 3    9V  .7V 114V
# 4   12V 1.0V 199V
# 5   14V 1.2V 245V
# 6   13V  .8V 158V
# 7   11V  .6V 136V
# 8   11V  .7V 132V
# 9   12V  .8V 171V
# 10  11V  .7V 155V
# 11  13V  .8V 166V
# 12  11V  .7V 138V
# 13  11V  .9V 173V
# 14   9V  .8V 143V
# 15   8V  .7V 105V
# 16   4V  .4V  21V
# 17   8V  .4V  26V
# 18  10V  .8V 154V
# 19   9V  .8V 130V
# 20  10V  .7V 113V
# 21  10V  .6V 102V
# 22  11V  .8V 135V
# 23   9V  .7V 120V
# 24  10V  .7V 126V
# 25 <NA> <NA> <NA>
# 26 <NA> <NA> <NA>
# 27   7V  .4V  35V
# 28   5V  .3V   9V
# 29   7V  .4V  48V
# 30   9V  .6V  91V
# 31   8V  .5V  81V
# 32   8V  .6V  80V
# 33   5V  .4V  14V
# 34   4V  .3V  11V
# 35   4V  .2V   7V
# 36   5V  .3V  13V
# 37   7V  .4V  34V
# 38   5V  .3V  18V
# 39   6V  .3V  15V
# 40   8V  .5V  58V
# 41   9V  .6V  76V
# 42   6V  .4V  29V
# 43   6V  .4V  30V
# 44   7V  .4V  31V
# 45   8V  .5V  32V
# 46   7V  .4V  34V
# 47   8V  .4V  57V
# 48   8V  .5V  58V
# 49   7V  .4V  52V
# 50   8V  .4V  49V

如果您的数据中有不想进行此替换的列,只需使用一个子集:

代码语言:javascript
复制
x[2:3] <- lapply(x[2:3], ...)

变式:

代码语言:javascript
复制
library(dplyr)
x %>%
  mutate_at(vars(var1, var2, var3), ~ if_else(grepl("N$", .), NA_character_, .))
# or, if all columns
x %>%
  mutate_all(~ if_else(grepl("N$", .), NA_character_, .))

NA_character_的使用有两个方面:

在基本的R版本中,它只是声明性的,说我的结果总是character;

  • In -- dplyr版本,它的between函数要求"yes“和"no”参数的类是相同的,class(NA)不是class("A").
票数 2
EN

Stack Overflow用户

发布于 2019-10-24 21:28:52

您试图找出的dplyr-stringr解决方案如下所示:

代码语言:javascript
复制
library(stringr)
library(dplyr)

df1 %>% 
  mutate_at(vars(var1:var3), 
            list(~str_replace_all(., "N$|M$|P$", replacement = NA_character_)))

#>    var1 var2 var3
#> 1    9V  .6V  77V
#> 2    6V  .3V  15V
#> 3    9V  .7V 114V
#> 4   12V 1.0V 199V
#> 5   14V 1.2V 245V
## ...
#> 20  10V  .7V 113V
#> 21  10V  .6V 102V
#> 22  11V  .8V 135V
#> 23   9V  .7V 120V
#> 24  10V  .7V 126V
#> 25 <NA> <NA> <NA>
#> 26 <NA> <NA> <NA>
#> 27   7V  .4V  35V
#> 28   5V  .3V   9V
#> 29   7V  .4V  48V
#> 30   9V  .6V  91V
## ...
#> 45   8V  .5V  32V
#> 46   7V  .4V  34V
#> 47   8V  .4V  57V
#> 48   8V  .5V  58V
#> 49   7V  .4V  52V
#> 50   8V  .4V  49V
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58548997

复制
相关文章

相似问题

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