代码之家  ›  专栏  ›  技术社区  ›  benett

gsub的求反|替换除某个向量中的字符串以外的所有内容

  •  5
  • benett  · 技术社区  · 6 年前

    我有一个字符串向量:

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

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

    因此,我想替换任何不是 N A. 具有 不适用

    我怎样才能做到这一点?

    我尝试了以下方法:

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

    但这些方法效果不好,因为它们用NA替换每个字符串中“A”或“N”的每个实例。所以在某些情况下 NANANANANANA ,而不是简单地 不适用

    3 回复  |  直到 6 年前
        1
  •  4
  •   Avinash Raj    6 年前

    使用负先行断言。

    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 后面应该是line end $

    .* 匹配所有字符

    所以上面的正则表达式将匹配任何字符串,除了 N A.

        2
  •  2
  •   akrun    6 年前

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

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

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

        3
  •  2
  •   s_baldur    2 年前

    这里有一个替代的regex解决方案

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

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