tidyverse内的累积聚合

Cet*_*ttt 1 r dataframe dplyr purrr tidyverse

说我有一个 tibble(或data.table)由两列组成:

a <- tibble(id = rep(c("A", "B"), each = 6), val = c(1, 0, 0, 1 ,0,1,0,0,0,1,1,1))
Run Code Online (Sandbox Code Playgroud)

此外,我有一个函数调用myfun,它将任意长度的数字向量作为输入并返回一个数字.例如,您可以将其myfun视为标准偏差.

现在我想为我的tibble(称为结果)创建第三列,其中包含myfun应用于val累积的输出和关于id的分组.例如,结果的第一个条目应该包含mfun(val[1]).第二个条目应包含myfun(val[1:2]),依此类推.我想实现myfun的累积版本.

当然,在tidyverse使用循环之外还有很多简单的解决方案.但我会对框架内tidyverse或data.table框架内的解决方案感兴趣.

任何帮助表示赞赏.

Moo*_*per 6

你可以这样做:

library(tidyverse)

a %>% 
  group_by(id) %>% 
  mutate(y = map_dbl(seq_along(val),~sd(val[1:.x]))) %>%
  ungroup

# # A tibble: 12 x 3
#       id   val         y
#    <chr> <dbl>     <dbl>
#  1     A     1        NA
#  2     A     0 0.7071068
#  3     A     0 0.5773503
#  4     A     1 0.5773503
#  5     A     0 0.5477226
#  6     A     1 0.5477226
#  7     B     0        NA
#  8     B     0 0.0000000
#  9     B     0 0.0000000
# 10     B     1 0.5000000
# 11     B     1 0.5477226
# 12     B     1 0.5477226
Run Code Online (Sandbox Code Playgroud)

说明

我们首先经常使用tidyverse链接组,然后我们使用mutate,而不是summarize,因为我们希望保持相同的非聚合行.

该函数map_dbl用于循环最终索引的向量.seq_along(val)将在1:6这里为两个团体.

使用map系列中的函数,我们可以使用~符号,它将假定函数的第一个参数被命名.x.

通过这些指标循环,我们计算首先sd(val[1:1])是sd(val[1])它NA,然后sd(val[1:2])等..

map_dbl通过设计返回一个向量doubles,并将它们堆叠在y列中.