R 在ID向量中的条目之间填充
寻找一个快速和简单的解决方案,我只能通过循环不雅观地解决这个问题。我有一个ID向量,看起来像这样:R 在ID向量中的条目之间填充,r,loops,vector,R,Loops,Vector,寻找一个快速和简单的解决方案,我只能通过循环不雅观地解决这个问题。我有一个ID向量,看起来像这样: id<-c(NA,NA,1,1,1,NA,1,NA,2,2,2,NA,3,NA,3,3,3) 通过循环遍历每个值并不难做到这一点,但我希望对许多非常长的向量执行此操作,并希望得到更简洁的解决方案。谢谢你的建议 这似乎有效。其思想是使用zoo::na.locf来正确填充nas,然后在不同数字之间插入nas id.target <- zoo::na.locf(id, na.rm = FA
id<-c(NA,NA,1,1,1,NA,1,NA,2,2,2,NA,3,NA,3,3,3)
通过循环遍历每个值并不难做到这一点,但我希望对许多非常长的向量执行此操作,并希望得到更简洁的解决方案。谢谢你的建议 这似乎有效。其思想是使用
zoo::na.locf
来正确填充na
s,然后在不同数字之间插入na
s
id.target <- zoo::na.locf(id, na.rm = FALSE)
id.target[(c(diff(id.target), 1L) > 0L) & is.na(id)] <- NA
id.target
## [1] NA NA 1 1 1 1 1 NA 2 2 2 NA 3 3 3 3 3
id.target 0L)&is.na(id)]这似乎有效。其思想是使用zoo::na.locf
来正确填充na
s,然后在不同数字之间插入na
s
id.target <- zoo::na.locf(id, na.rm = FALSE)
id.target[(c(diff(id.target), 1L) > 0L) & is.na(id)] <- NA
id.target
## [1] NA NA 1 1 1 1 1 NA 2 2 2 NA 3 3 3 3 3
id.target 0L)&is.na(id)]这里有一个base R
选项
d1 <- do.call(rbind,lapply(split(seq_along(id), id), function(x) {
i1 <- min(x):max(x)
data.frame(val= unique(id[x]), i1)}))
id[seq_along(id) %in% d1$i1 ] <- d1$val
id
#[1] NA NA 1 1 1 1 1 NA 2 2 2 NA 3 3 3 3 3
d1这里有一个base R
选项
d1 <- do.call(rbind,lapply(split(seq_along(id), id), function(x) {
i1 <- min(x):max(x)
data.frame(val= unique(id[x]), i1)}))
id[seq_along(id) %in% d1$i1 ] <- d1$val
id
#[1] NA NA 1 1 1 1 1 NA 2 2 2 NA 3 3 3 3 3
d1谢谢。这或多或少是我解决问题的方式,但我希望避免循环。也许没有什么好的理由,真的,除了看看发生了什么possible@daanoo没问题。如果你展示了你的代码,我就不会花时间在这条路线上了。谢谢。这或多或少是我解决问题的方式,但我希望避免循环。也许没有什么好的理由,真的,除了看看发生了什么possible@daanoo没问题。如果你已经展示了你的代码,我就不会在这条路线上花费时间了。谢谢,我以前从未见过na.locf()。刚刚实现了这个,但出于好奇:可以用简单的base R'
写第一行吗?你可以做一些类似c(NA,id[!is.NA(id)])[cumsum(!is.NA(id))+1]
@daanoo:除了David的评论之外,还有approxfun(seq_-along(id),id,“constant”)(seq_-along(id))
这与zoo::na.locf
的实际实现方式类似。谢谢,我以前从未见过na.locf()。刚刚实现了这个,但出于好奇:可以用简单的base R'
写第一行吗?你可以做一些类似c(NA,id[!is.NA(id)])[cumsum(!is.NA(id))+1]
@daanoo:除了David的评论之外,还有approxfun(seq_-along(id),id,“constant”)(seq_-along(id))
这类似于实际实现的zoo::na.locf
。