我有一个包含数百万个长字符串的数据框,其中包含0,1,NA`s。
我必须根据以下方法替换NA:
实施例: 我们假设我有以下字符串 0011NANA01NA0011NANANANA
我想要的输出: '011000100011____', 这意味着在字符串的末尾,所有的NA都应该用空格替换(我使用'_'来表示空格)。
AFAIK我应该使用gsub()来进行此更改。我尝试使用以下代码但没有任何成功。
gsub("NA", " ", "0011NANA01NA0011NANANANA")
- 用空格替换所有的NA。
gsub("NA$", " ", "0011NANA01NA0011NANANANA")
- 用空格替换字符串的最后一个NA。
如果我在字符串的末尾只有一个NA,这可以正常工作。但是,如何在此示例中更改字符串末尾的所有4个NA? 有人可以帮我解决这个问题吗? 提前感谢您提供各种帮助!
答案 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 "
答案 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"