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

时间:2018-08-30 21:46:56

标签: r tidyr

id分组后,我希望用连续值替换dist_from_top中的NA,以使dist_from_top变成c(5,4,3,2,1,5,4, 3,2)。我将每个dist_from_top分组中的一个id值用作各种种子来填充上方和下方的dist_from_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
  )

使用fill()

的“几乎在那里”解决方案
df %>% 
  group_by(id) %>% 
  fill(dist_from_top, .direction = "up") %>%
  fill(dist_from_top, .direction = "down")

1 个答案:

答案 0 :(得分:3)

  1. 创建一个从任何起点开始在每组中向下计数的列:

    ... %>% mutate(rn = -row_number())
    
  2. dist_from_top不是rn的一行添加dist_from_topNA之间的差所定义的偏移量:

    ... %>% 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)

如果有一个全{NA组,您会看到一条警告。