繁体   English   中英

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

[英]tidyr::fill() with sequential integers rather than a repeated value

id分组后,我希望将dist_from_top的NA替换为顺序值,以使dist_from_top变为c(5,4,3,2,1,5,4,3,2)。 我使用每个id分组中的一个dist_from_top值作为各种种子来填充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. 创建一个从任何起点开始在每个组中向下计数的列:

     ... %>% mutate(rn = -row_number()) 
  2. 对于dist_from_top不是NA一行,添加由dist_from_toprn之差定义的偏移量:

     ... %>% mutate(dist_from_top = rn + max(dist_from_top - rn, na.rm = TRUE)) 

    假设只有一个不是NA值,则此方法仅使用max()来选择一个值。

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

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

如果存在全NA组,则会显示警告。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM