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框架内的解决方案感兴趣.
任何帮助表示赞赏.
你可以这样做:
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列中.