在dplyr中突变多个cumsum

在dplyr中突变多个cumsum,r,dplyr,mutate,cumsum,R,Dplyr,Mutate,Cumsum,我正在尝试用mutate开发一个cumsum。挑战在于我有10个专栏要做,我知道如何一个接一个地做。有没有一种方法可以让我做一些像变异(跨越(c(3:4)),~cumsum(c(3:4)) 预期产出: animals period weight1 weight2 <chr> <date> <dbl> <dbl> 1 E1 2021-03-04 704 0 2 E1 2021

我正在尝试用
mutate
开发一个cumsum。挑战在于我有10个专栏要做,我知道如何一个接一个地做。有没有一种方法可以让我做一些像变异(跨越(c(3:4)),~cumsum(c(3:4))

预期产出:

  animals period     weight1 weight2
  <chr>   <date>       <dbl>   <dbl>
1 E1      2021-03-04     704       0
2 E1      2021-03-11    1438     235
3 E1      2021-03-18    2091     560
4 E2      2021-03-04     851       0
5 E2      2021-03-11    1762     148
6 E2      2021-03-18    2591     348
动物期体重1体重2
1 E1 2021-03-04 704 0
2 E1 2021-03-11 1438 235
3 E1 2021-03-18 2091 560
4 E2 2021-03-04 851 0
5 E2 2021-03-11 1762 148
6 E2 2021-03-18 2591 348
尝试这样做

df%
分组依据(动物)%>%
变异(跨越(以(“重量”)开头,cumsum))
#>#tibble:6 x 4
#>#群体:动物[2]
#>动物期体重1体重2
#>                
#>1 E1 2021-03-04 704 0
#>2 E1 2021-03-11 1438 235
#>3 E1 2021-03-18 2091 560
#>4 E2 2021-03-04 851 0
#>5 E2 2021-03-11 1762 148
#>6 E2 2021-03-18 2591 348
由(v1.0.0)于2021年3月24日创建


vars%group\u by(animals)%%>%mutate(跨越(全部(vars)、cumsum))
您尝试执行的操作将出错。一旦您
group\u by(animals)
,只有三列
mutate
可以操作。因此您可以使用:

cat %>% 
  group_by(animals) %>%
  mutate(across(2:3, cumsum))
# A tibble: 6 x 4
# Groups:   animals [2]
  animals period     weight1 weight2
  <chr>   <date>       <dbl>   <dbl>
1 E1      2021-03-04     704       0
2 E1      2021-03-11    1438     235
3 E1      2021-03-18    2091     560
4 E2      2021-03-04     851       0
5 E2      2021-03-11    1762     148
6 E2      2021-03-18    2591     348
cat %>% 
  group_by(animals) %>%
  mutate(across(starts_with("weight"), cumsum))
或者,如果您只想对所有数字列进行操作:

cat %>% 
  group_by(animals) %>%
  mutate(across(where(is.numeric), cumsum))
后两种方法均可提供所需的输出。

基本R解决方案:

num_col_idx <- vapply(df, is.numeric, logical(1))

cbind(df[,!num_col_idx],
      data.frame(do.call(rbind, lapply(
        split(df[, num_col_idx], df$animals), cumsum)), row.names = NULL))

num\u col\u idx谢谢,我喜欢
all\u的方法。
cat %>% 
  group_by(animals) %>%
  mutate(across(where(is.numeric), cumsum))
num_col_idx <- vapply(df, is.numeric, logical(1))

cbind(df[,!num_col_idx],
      data.frame(do.call(rbind, lapply(
        split(df[, num_col_idx], df$animals), cumsum)), row.names = NULL))