将观察结果按组前进n行

时间:2018-10-10 16:11:26

标签: r dplyr zoo

我有这样的数据,这些数据按“普通”分组:

orgid date    type counter
12345 1-1-17  sale  3
12345 1-2-17  NA   NA
12345 1-3-17  NA   NA
78945 1-1-17  NA   NA
78945 1-2-17  free 2
78945 1-3-17  NA   NA

对于每个“普通”,我想“拖动”“类型” N-1行,其中N由“计数器”列定义。结果应如下所示:

orgid date    type counter
12345 1-1-17  sale   3
12345 1-2-17  sale   NA
12345 1-3-17  sale   NA
78945 1-1-17  NA     NA
78945 1-2-17  free   2
78945 1-3-17  free   NA

我相信我可以在na.locf包中使用zoo,但是我无法破解代码。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

我认为您不能为此使用zoo::na.locf,我认为它不适合作为限制因素。(感谢Henrik直率我!)

两种解决方案,我相信data.table专家可以添加相关的第三种解决方案:

基本R

do.call("rbind.data.frame",
        lapply(split(dat, cumsum(!is.na(dat$type))),
               function(d) within(d, type[seq_len(min(nrow(d), counter[1]))] <- type[1])
               ))

dplyr

library(dplyr)
dat %>%
  mutate(grp = cumsum(!is.na(type))) %>%
  group_by(grp) %>%
  mutate(type = if_else(row_number() <= counter[1], type[1], type)) %>%
  ungroup() %>%
  select(-grp)

数据

dat <- read.table(header=TRUE, stringsAsFactors=FALSE, text='
orgid date    type counter
12345 1-1-17  sale  3
12345 1-2-17  NA   NA
12345 1-3-17  NA   NA
78945 1-1-17  NA   NA
78945 1-2-17  free 2
78945 1-3-17  NA   NA')