Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 在ID向量中的条目之间填充_R_Loops_Vector - Fatal编程技术网

R 在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向量,看起来像这样:

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