根据字符串中“NA”的位置,用0或空格替换NA`s

时间:2016-05-23 18:37:28

标签: regex r

我有一个包含数百万个长字符串的数据框,其中包含0,1,NA`s。

我必须根据以下方法替换NA:

  1. 字符串末尾的所有NA都必须用空格
  2. 替换
  3. 字符串中间的所有NA都必须更改为0.
  4. 实施例: 我们假设我有以下字符串 0011NANA01NA0011NANANANA

    我想要的输出: '011000100011____', 这意味着在字符串的末尾,所有的NA都应该用空格替换(我使用'_'来表示空格)。

    AFAIK我应该使用gsub()来进行此更改。我尝试使用以下代码但没有任何成功。

    gsub("NA", " ", "0011NANA01NA0011NANANANA") - 用空格替换所有的NA。 gsub("NA$", " ", "0011NANA01NA0011NANANANA") - 用空格替换字符串的最后一个NA。

    如果我在字符串的末尾只有一个NA,这可以正常工作。但是,如何在此示例中更改字符串末尾的所有4个NA? 有人可以帮我解决这个问题吗? 提前感谢您提供各种帮助!

2 个答案:

答案 0 :(得分:2)

这样做。但就像理查德所说的那样,如果它掌握在你的权力之中,你可能希望将你的精力集中在代码的早期。

s <- "0011NANA01NA0011NANANANA"

#inner regex: find NA which is followed by
#  _only_ N or A until the string ends.
#  those are spaces.

#outer regex: replace remaining NA with 0
gsub("NA", "0", gsub("NA(?=[NA]*$)", " ", s, perl = TRUE))
# [1] "0011000100011    "

Explore the more complicated regex here

答案 1 :(得分:1)

这是另一个嵌套的gsub,其中第一个替换了&#34; NA&#34;与空间。在第二个gsub中,我们匹配字符串末尾的一个或多个空格(\\s+)($)。通过使用(*SKIP)(*FAIL),它会强制跳过左边匹配的所有字符并允许第二个模式匹配(\\s),即任何不在字符串末尾的空格并替换它会0。

 gsub("\\s+$(*SKIP)(*F)|\\s", "0", gsub("NA", " ", s), perl=TRUE)
 #[1] "0011000100011    "

数据

s <- "0011NANA01NA0011NANANANA"