【问题标题】:Fill in-between entries in an ID vector在 ID 向量中填充中间条目
【发布时间】:2016-01-14 10:54:38
【问题描述】:

寻找一个快速简单的解决方案来解决我只能通过循环来解决的问题。我有一个看起来像这样的 ID 向量:

id<-c(NA,NA,1,1,1,NA,1,NA,2,2,2,NA,3,NA,3,3,3)

位于单个数字 (id[6], id[14]) 序列之间的 NA 需要替换为该数字。但是,不满足此条件的 NA(两个 不同 数字的序列之间的那些)需要单独处理(即id[1],id[2],id[8],id[12])。因此目标向量为:

id.target<-c(NA,NA,1,1,1,1,1,NA,2,2,2,NA,3,3,3,3,3)

通过循环遍历每个值并不难做到这一点,但我希望对许多非常长的向量执行此操作,并希望有一个更简洁的解决方案。感谢您的任何建议。

【问题讨论】:

    标签: r loops vector


    【解决方案1】:

    这似乎有效。我们的想法是使用zoo::na.locf 以正确填充NAs,然后在它们位于不同数字之间时插入NAs

    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
    

    【讨论】:

    • 谢谢,我以前从未见过 na.locf()。刚刚实现了这个,但出于好奇:有人可以用简单的base R' 写第一行吗?
    • 你可以做类似c(NA, id[!is.na(id)])[cumsum(!is.na(id)) + 1]
    • @daanoo :除了大卫的评论,还有approxfun(seq_along(id), id, "constant")(seq_along(id)),这类似于zoo::na.locf的实际实现方式。
    【解决方案2】:

    这是一个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
    

    【讨论】:

    • 谢谢。这或多或少是我解决它的方式,但我希望避免循环。也许没有什么好理由,真的,除了看看什么是可能的
    • @daanoo 没问题。如果你展示了你的代码,我就不会花时间在那条路线上。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多