按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")
答案 0 :(得分:3)
创建一个从任何起点开始在每组中向下计数的列:
... %>% mutate(rn = -row_number())
为dist_from_top
不是rn
的一行添加dist_from_top
和NA
之间的差所定义的偏移量:
... %>% 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
组,您会看到一条警告。