R 按组将观察结果向前推进n行

R 按组将观察结果向前推进n行,r,dplyr,zoo,R,Dplyr,Zoo,我有这样的数据,按“orgid”分组: 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 对于每个“orgid”,我想“向下拖动”N-1行的“type”,其中N由“counter”列定义。结果如下所示: orgid date

我有这样的数据,按“orgid”分组:

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
对于每个“orgid”,我想“向下拖动”N-1行的“type”,其中N由“counter”列定义。结果如下所示:

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
我相信我可以在
zoo
软件包中使用
na.locf
,但我无法破解代码。有什么想法吗?

我不认为你可以使用
zoo::na.locf
为此,我不认为这是一个限制因素。(感谢亨里克让我明白过来!)

两个解决方案,我相信
数据。表
专家可以添加相关的第三个:

基尔 资料
dat我认为你不能使用
zoo::na.locf
为此,我不认为这是一个限制因素。(感谢亨里克让我明白过来!)

两个解决方案,我相信
数据。表
专家可以添加相关的第三个:

基尔 资料
dat您的结转似乎忘记了
orgid
,是否也应该在那里分组?还是
orgid
date
与这个问题无关?@r2evans感谢您的回答。在完整的数据中,日期持续了整整两年,并且有大量的Orgid,每个Orgid都有不同的“类型”(我们可以称之为事件)。我相信这可以在忽略orgid&date的情况下实现,但希望包含上下文的完整数据。@Jason在您发布的这个特定示例中,如果第一个
计数器
值为4,您希望第四行的type=sale,还是不希望?@AntoniosK 4表示总共4天,因此我们需要再填充3行,直到第四行(如果有道理的话)是的,只是想确定你的第四排是否有一个不同的
orgid
。你的结转似乎忘记了
orgid
,应该也在那里分组吗?还是
orgid
date
与这个问题无关?@r2evans感谢你的回答。日期在fu中持续了整整两年ll数据,有许多OrgID,每个OrgID都有不同的“类型”(我们可以称它们为事件)。我相信在忽略orgid和date的情况下可以实现这一点,但希望包含上下文的完整数据。@Jason在您发布的这个特定示例中,如果第一个
计数器
值为4,您希望第四行的type=sale,还是不希望?@AntoniosK 4表示总共4天,因此我们需要再填充3行,直到第四行(如果有道理的话)是的,我只是想确定你的第四行是否有不同的
orgid
。这太接近了!它少了一行,所以我想我需要N行而不是N-1行。但是我可以改变计数器的定义来实现这一点。你介意解释一下第二个变种的作用吗?因为
mutate
o一次操作整列,我需要为特定组(
grp
)中的每一行分配一些内容。在这种情况下,我“确信”第一个
计数器是要修改的行数,并且
dplyr::row_number()
标识分组中的行号,始终从1开始,因此如果需要,则有效地标识行号(1:4这太接近了!它少了一行,所以我想我需要N行而不是N-1。但是我可以改变计数器的定义来实现这一点。你介意解释一下第二个mutate是做什么的吗?因为
mutate
一次操作整个列,所以我需要为特定组中的每一行分配一些内容(
grp
)。在这种情况下,我“确信”第一个
计数器
是要修改的行数,并且
dplyr::row_number()
标识分组中的行号,总是从1开始,因此这实际上是
if_else(1:4)
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])
               ))
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')