我有这样的数据,这些数据按“普通”分组:
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
,但是我无法破解代码。有什么想法吗?
答案 0 :(得分:2)
我认为您不能为此使用(感谢Henrik直率我!)zoo::na.locf
,我认为它不适合作为限制因素。
两种解决方案,我相信data.table
专家可以添加相关的第三种解决方案:
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')