替换与多个不同模式匹配的列值

沙欣

在以下数据框中:

library(tidyverse)
df <- tibble(notes=c("Positive result","Negative","NEG","POS >2","pOS","Cannot Determine","2.4","3.1","0.2"))

  notes           
  <chr>           
1 Positive result 
2 Negative        
3 NEG             
4 POS >2          
5 pOS             
6 Cannot Determine
7 2.4             
8 3.1             
9 0.2

我想定义一个单行来替换注释列中与模式匹配的条目。如果只有两个条件,我会使用三元运算符。但是这里有5个

我正在尝试将注释中的值替换为:

  1. could be turned into a double -> "3"
  2. grepl("pos",tolower(notes)) -> "2"
  3. grepl("neg",tolower(notes)) -> "1"
  4. 以上都不是-> "0"

我最初是这样做的:

df %>%
  mutate(notes=ifelse(grepl("[[:digit:]]+",notes)),"3",notes) %>%  # could be coerced into a double
  mutate(notes=ifelse(grepl("pos",tolower(notes))),"2",notes) %>%  # contains "pos"
  mutate(notes=ifelse(grepl("neg",tolower(notes))),"1",notes) %>%  # contains "neg"
  mutate(notes=ifelse(grepl("3|2|1",tolower(notes))),notes,"0") %>%  # none of the above
  type.convert()

期望的输出

notes           
<dbl>           
1 2 
2 1        
3 1             
4 2          
5 2             
6 0
7 3            
8 3             
9 3             
阿克伦

我们可以用 case_when

library(dplyr)
library(stringr)
df %>% 
  mutate(notes1 = toupper(substr(notes, 1, 3)), 
        notes =case_when(notes1 == "POS" ~ 2, 
                         notes1 == 'NEG' ~ 1, 
                         str_detect(notes, '^[0-9.]+$')~ 3,
                         TRUE ~ 0)) %>%
  select(-notes1)
# A tibble: 9 x 1
#  notes
#  <dbl>
#1     2
#2     1
#3     1
#4     2
#5     2
#6     0
#7     3
#8     3
#9     3

如果我们需要保持数值不变,则一个选项是as.numeric然后coalesce

df %>% 
 mutate(notes1 = toupper(substr(notes, 1, 3)), 
      notes2 =case_when(notes1 == "POS" ~ 2, 
                       notes1 == 'NEG' ~ 1, 
                       str_detect(notes, '^[0-9.]+$')~ 3,
                       TRUE ~ 0)) %>%
 select(-notes1) %>% 
 mutate(notes = coalesce(as.numeric(notes), notes2)) %>% 
 select(-notes2)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

替换与R中的特定模式匹配的列中的值

来自分类Dev

多个模式匹配后替换数据表列中的多个值

来自分类Dev

在R中的不同列中替换多个“小于值”

来自分类Dev

多个匹配模式内的字符替换

来自分类Dev

如何用来自多个不同列的值替换多个列的空值

来自分类Dev

正则表达式匹配模式,但替换为不同的值

来自分类Dev

匹配多个列的值

来自分类Dev

sed:匹配模式,然后替换每次出现的不同模式

来自分类Dev

比较具有不同大小的不同文件的列,并用不匹配的NA值替换

来自分类Dev

模式匹配句子中的多个值

来自分类Dev

如何匹配模式不同的三列?

来自分类Dev

匹配并替换列表中同一列中的不同值

来自分类Dev

匹配并替换列表中同一列中的不同值

来自分类Dev

如何匹配特定列中的多个模式?

来自分类Dev

合并多个文件的列,同时根据不同的列匹配顺序,并为缺失值添加0

来自分类Dev

用ansible中的多个值替换多个模式

来自分类Dev

列匹配特定值时插入或替换

来自分类Dev

仅当满足多个条件时,才将不同列中的值匹配到行

来自分类Dev

如果来自两个不同工作表的多个条件匹配,则返回相应的列值?

来自分类Dev

匹配模式并替换

来自分类Dev

R regex匹配模式并替换为动态值

来自分类Dev

替换/修改逻辑向量中的值(模式匹配)

来自分类Dev

匹配一个模式并替换以下键值对的值

来自分类Dev

将列值中的模式替换为列值

来自分类Dev

根据相邻列的匹配值替换列的值

来自分类Dev

替换多个模式python

来自分类Dev

如何在Perl中匹配单个模式并将其替换为多个模式

来自分类Dev

模式匹配多个变量

来自分类Dev

多个名称匹配模式

Related 相关文章

热门标签

归档