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” , test %>% |
- 你能在 “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) %>% # V1 V2 V3 V4 V5 V6 V7 |
- 感谢您的建议,但这也不起作用,因为它也从基因名称中删除了 NA(GeneNA 变成了 Gene,NAGene218 变成了 Gene218)。很抱歉,我对所需的输出不太清楚,但我现在已经更新了原始问题。
来源:https://www.codenong.com/58416017/