关于正则表达式:从 R 中的表(字符)中删除 NA 字符串

Remove NA strings from table (characters) in R

如何在 R 中删除一个简单数据框中的 NA 字符串,如下面的,它由单列组成?

1
2
3
4
5
head(test)
Column1
[1]"Gene1 Gene2 Gene3 NA NA NA NA"
[2]"Gene41 NAGene218 GeneX NA"
[3]"Gene19 GeneNA NA NA NA NA NA"

有些基因以 \\'NA\\' 开头或结尾,因此为了避免摆脱那些 NA,gsub 正则表达式必须指定 NA 在字符串中的位置...类似于:
test2 <- gsub('^ NA$',"", test$Column1)^ 表示 \\'NA\\' 必须位于字符串的开头,而 $ 必须位于字符串的末尾...我相信这很简单,但我不知道明白我做错了什么? (因为我对这些正则表达式符号不是很熟悉)

[更新] - 期望的输出

1
2
3
4
5
head(test2)
Column1
[1]"Gene1 Gene2 Gene3"
[2]"Gene41 NAGene218 GeneX"
[3]"Gene19 GeneNA"


你可以使用

1
test$Column1 <- gsub("^NA(?:\\\\s+NA)*\\\\b\\\\s*|\\\\s*\\\\bNA(?:\\\\s+NA)*$","", test$Column1)

查看正则表达式演示

详情

  • ^NA(?:\\s+NA)*\\b\\s* - 备选方案 1:

    • ^ - 字符串的开头
    • NA - NA 字符串
    • (?:\\s+NA)* - 0 次或多次重复 1 个空格和 NA 文本
    • \\b - 确保有单词边界(不应该出现 NAGene 匹配)
    • \\s* - 0 个空格
  • | - 或
  • \\s*\\bNA(?:\\s+NA)*$ - 备选方案 2:

    • \\s* - 0 个空格
    • \\b - 确保有单词边界(不应该出现 GeneNA 匹配)
    • NA - NA 字符串
    • (?:\\s+NA)* - 0 次或多次重复 1 个空格和 NA 文本
    • $ - 字符串结束。


stringr 试试这个:

1
2
3
4
5
6
7
8
library(tidyverse)

test <- tibble(column1 = c("Gene1 Gene2 Gene3 NA NA NA NA" ,
                          "Gene41 NAGene218 GeneX NA",
                          "Gene19 GeneNA NA NA NA NA NA"))

test %>%
 mutate(column1 = str_remove_all(column1," NA|NA"))


或:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
library(stringr)
library(tidyverse)

x <- c("Gene1 Gene2 Gene3 NA NA NA NA","Gene41 NAGene218 GeneX NA","Gene19 GeneNA NA NA NA NA NA")

str_split(x,"\\\\s", simplify = TRUE) %>%
  as_tibble() %>%
  mutate_all(~str_remove(.x,"^(NA)|(NA)$"))

# V1     V2      V3    V4    V5    V6    V7  
# <chr>  <chr>   <chr> <chr> <chr> <chr> <chr>
#   1 Gene1  Gene2   Gene3""   ""   ""   ""  
# 2 Gene41 Gene218 GeneX""   ""   ""   ""  
# 3 Gene19 Gene   ""   ""   ""   ""   ""