【问题标题】:Negation of gsub | Replace everything except strings in a certain vectorgsub 的否定 |替换某个向量中除字符串之外的所有内容
【发布时间】:2018-03-13 09:46:30
【问题描述】:

我有一个字符串向量:

ve <- c("N","A","A","A","N","ANN","NA","NFNFNAA","23","N","A","NN", "parnot", "important", "notall")

我想在这个向量中只保留三个可能的值:N、A 和 NA。

因此,我想用NA 替换任何不是N 或A 的元素。

我怎样才能做到这一点?

我尝试了以下方法:

gsub(ve, pattern = '[^NA]+', replacement = 'NA')
gsub(ve, pattern = '[^N|^A]+', replacement = 'NA')

但是这些都不能很好地工作,因为它们用 NA 替换了每个字符串中的每个“A”或“N”实例。所以在某些情况下,我最终会得到NANANANANANA,而不是简单的NA。

【问题讨论】:

  • 试试%in%,即ve[!ve %in% c("A", "N", "NA")] &lt;- 'NA'
  • @akrun 绝妙的方法。值得回答。

标签: r regex gsub negation


【解决方案1】:

使用否定的前瞻断言。

ve <- c("N","A","A","A","N","ANN","NA","NFNFNAA","23","N","A","NN", "parnot", "important", "notall")
sub("^(?![NA]$).*", "NA", ve, perl=T)
# [1] "N"  "A"  "A"  "A"  "N"  "NA" "NA" "NA" "NA" "N"  "A"  "NA" "NA" "NA" "NA"

^(?![NA]$) 断言

-> 在开始^ 之后应该只有一个字母[NA] 或者N 或A,后面应该是行尾$。

.* 匹配所有字符

所以上面的正则表达式可以匹配除N或A以外的任何字符串

【讨论】:

    【解决方案2】:

    如果我们正在寻找固定匹配,则使用%in% 与否定! 并将其分配给'NA'

    ve[!ve %in% c("A", "N", "NA")] <- 'NA'
    

    请注意,在 R 中,缺失值未加引号 NA 且未加引号。希望它是一个不同的类别,并建议将类别名称更改为不同的名称,以避免将来在解析时混淆

    【讨论】:

    • 我接受这个作为正确答案,因为它是一种非常简单直接的方法/解决基本问题的方法。
    【解决方案3】:

    这是另一种正则表达式解决方案

    ve[!grepl("^[N|A]$", ve)] <- NA_character_
    

    您可能仍然应该使用 Akrun 的解决方案。

    【讨论】:

      猜你喜欢
      • 2018-05-12
      • 1970-01-01
      • 1970-01-01
      • 2018-10-19
      • 2020-06-09
      • 1970-01-01
      • 1970-01-01
      • 2016-12-07
      • 1970-01-01
      相关资源
      最近更新 更多