关于正则表达式:从 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”
  • 期望的输出是什么?请在示例中显示它。
  • 您好 – 我已经更新了帖子以更清楚地了解所需的输出。 @Clemsang,不幸的是,您的建议不起作用,因为某些基因名称以 NA 开头-第一次出现以”NA”开头的基因时,输出被切断。


你可以使用

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 文本
    • $ – 字符串结束。
  • 仅供参考:如果您发现性能问题或任何奇怪的行为,请将 perl=TRUE 参数添加到 gsub、gsub(“^NA(?:\\\\s+NA)*\\\\b\\\\s*|\\\\s*\\\\bNA(?:\\\\s+NA)*$”,””, test$Column1, perl=TRUE)
  • 谢谢,这工作得很好!! (实际上,没有 perl 选项它工作得很好)(我真的认为这将是一个相对简单的问题,但是这个正则表达式的复杂性超出了这个世界 – 至少乍一看哈哈)


从 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”))

  • 你能在 “Gene41 NAGene218 GeneX NA” 上试试吗
  • 试试看,那里没有看到其他 NA。
  • 抱歉,我应该更清楚地了解所需的输出(我现在更新了帖子以包含此内容)。感谢您的建议,但此命令不适用于我的情况,因为它也删除了以 NA 开头的基因(在我的示例中为 NAGene218)。


或:

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   “”   “”   “”   “”   “”

  • 感谢您的建议,但这也不起作用,因为它也从基因名称中删除了 NA(GeneNA 变成了 Gene,NAGene218 变成了 Gene218)。很抱歉,我对所需的输出不太清楚,但我现在已经更新了原始问题。


来源:https://www.codenong.com/58416017/

微信公众号
手机浏览(小程序)
0
分享到:
没有账号? 忘记密码?