r - 根据周围的值替换 NA
问题描述
假设我有一个充满NA
s 的向量,除了每 5 个值,它可能是两个级别之一:
RNGkind('Mersenne-Twister')
set.seed(42)
x <- NULL
for(i in 1:1000){
x <- c(x,c(sample(c('Hey', 'Hullo'), 1, rep = F), rep(NA, 4)))
}
x
我想NA
根据周围的情况填充 s:
"Hullo" NA NA NA NA "Hey": NAs become "Hey"
"Hullo" NA NA NA NA "Hullo" NAs become "Hullo"
"Hey" NA NA NA NA "Hullo": NAs become "Hullo"
"Hey" NA NA NA NA "Hey": NAs become "Hey"
我想出了一个for
循环,它迭代地查看每个元素并NA
根据大量if
语句填充 s:
for(i in 1:length(x)){
if(!is.na(x[i])){
next
}else{
if(x[i-1] == 'Hullo' & x[i+4] == 'Hullo' | x[i-1] == 'Hey' & x[i+4] == 'Hullo'){
x[i:(i+3)] <- 'Hullo'
}else{
x[i:(i+3)] <- 'Hey'
}
}
}
但这有点笨拙,也不处理向量的尾部,那里可能有一个NA
. 理想情况下,最后一组NA
将匹配最后一组的输出。
如果它更容易,那么NA
在两个非 s 之间总会有四个NA
s。
有没有:
- 更优雅/更快的方式来做到这一点?
- 一种无需手动填充向量末尾的方法?
编辑:添加了最后一组NA
s 并确认非NA
s 总是以一致的时间间隔出现(每 5 个元素)
解决方案
这是使用tidyr
包的解决方案:
xres <- tidyr::fill(data = data.frame(x, stringsAsFactors = FALSE), x, .direction = "up")
xres <- tidyr::fill(data = xres, x, .direction = "down")
xres$x
首先你填写一个方向,然后填写另一个方向以获得最后的值
推荐阅读
- react-native - 如何提供指向平面列表详细信息页面的链接
- javascript - this.init 不是函数
- html - 弹出标签的位置
- postgresql - Postgresql 与 Java 的连接给出白页错误
- javascript - 按 ID 数组过滤对象数组
- service - 对于旧的 S3 NEO,哪个 Lineage OS 版本更稳定?
- javascript - 在“mongosh”中,如何删除所有数据库而不删除典型的“admin”、“config”或“local”数据库?
- ruby-on-rails - 访问/使用 Rails 凭据的挑战
- sql - 除法时乘以 1.0 或 1.00
- reactjs - How to send a
in our chat component, many people don't know they can find the emojis