tidyr::fill()具有连续整数而不是重复值

tidyr::fill()具有连续整数而不是重复值,r,tidyr,R,Tidyr,按id分组后,我希望用顺序值替换dist_from_top中的NAs,以便dist_from_top变为c(5,4,3,2,1,5,4,3,2)。我使用每个id分组中的dist\u from\u top值作为排序种子,以填充dist\u from\u top的上下值 tidyr::fill()可以在整个分组中填充相同的值,但我想不出一种方法使其在填充时增加或减少1。非常感谢您的帮助 library(dplyr) library(tidyr) df <- tribble( ~

id
分组后,我希望用顺序值替换
dist_from_top
中的NAs,以便
dist_from_top
变为c(5,4,3,2,1,5,4,3,2)。我使用每个
id
分组中的
dist\u from\u top
值作为排序种子,以填充
dist\u from\u top
的上下值

tidyr::fill()
可以在整个分组中填充相同的值,但我想不出一种方法使其在填充时增加或减少1。非常感谢您的帮助

library(dplyr)
library(tidyr)

df <- 
  tribble(
    ~id, ~mgr, ~dist_from_top,
    "A", "B",  NA,
    "A", "C",  NA,
    "A", "D",  3,
    "A", "E",  NA,
    "A", "F",  NA,
    "B", "C",  NA,
    "B", "D",  4,
    "B", "E",  NA,
    "B", "F",  NA
  )
  • 从任意起点开始,在每个组中创建向下计数的列:

    ... %>% mutate(rn = -row_number())
    
  • 对于
    dist\u from\u top
    不是
    NA
    的一行,添加由
    dist\u from\u top
    rn
    之间的差值定义的偏移量:

    ... %>% mutate(dist_from_top = rn + max(dist_from_top - rn, na.rm = TRUE))
    
    这使用
    max()
    仅拾取一个值,假设只有一个值不是
    NA

  • 两种
    mutate()
    操作都对组进行操作:

    df %>%
      group_by(id) %>%
      mutate(rn = ...) %>%
      mutate(dist_from_top = ...) %>%
      ungroup() %>%
      select(-rn)
    

    如果有一个all-
    NA
    组,您将看到一条警告。

    您总是从5开始吗?我不确定我是否明白这将如何与id B具体工作。那里只有4条记录。我很确定
    fill
    并不是为填充不同的值而设计的,所以我认为定制
    mutate()
    函数可能是更好的选择。如果你有
    c(5,NA,1)
    ?这里填的是什么?@flick先生,我不总是以任何数字开头或结尾。每个
    id
    将有一个与之关联的有序
    mgr
    值列表,其中一个
    mgr
    值将有一个“种子”值,我需要从中填充相邻值。答案可能不涉及
    fill()
    ,但fill的附加版本是我能在概念上描述我的问题的最接近的版本。
    df %>%
      group_by(id) %>%
      mutate(rn = ...) %>%
      mutate(dist_from_top = ...) %>%
      ungroup() %>%
      select(-rn)