【发布时间】:2019-10-02 09:45:18
【问题描述】:
假设我有一个充满 NAs 的向量,除了每 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
我想根据周围的情况填写NAs:
"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 循环,它迭代地查看每个元素并根据大量 if 语句填充 NAs:
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 将匹配最后一组的输出。
如果它更容易,在两个非NAs 之间总会有四个NAs。
有吗:
- 更优雅/更快的方式来做到这一点?
- 一种无需手动填充矢量末尾的方法?
编辑: 添加了最后一组 NAs 并确认非NAs 总是以一致的时间间隔出现(每 5 个元素)
【问题讨论】:
-
嗨 Ronak: 1. 最后一个值为 NA,最后一组的输出将与前一组的输出匹配。 2. 是的,两个非 NA 之间总是有 4 个 NA。
-
嗯,不完全是,有一些不匹配:如果你运行 for 循环,然后你的:x1
标签: r for-loop if-statement vector na