一项中多个值的累计总和

Kat*_*ina 5 r sum dataframe cumsum

假设我有这个数据帧(“数字”变量也来自原始数据帧中的字符类型):

df <- data.frame(
  id = c(1,2,2,1,2),
  number = c(30.6, "50.2/15.5", "45/58.4", 80, "57/6"))
df$number <- as.character(df$number)
Run Code Online (Sandbox Code Playgroud)

现在我想添加另一列,其中包含每个 ID 的累积总和,我使用 执行此操作df %>% mutate(csum = ave(number, id, FUN=cumsum)),它适用于单个数字,但当然不适用于用“/”分隔的数字。我怎么解决这个问题?

最终的数据框应该是这样的:

df2 <- data.frame(
  id = c(1,2,2,1,2),
  number = c(30.6, "50.2/15.5", "45/58.4", 80, "57/6"),
  csum = c(30.6, "50.2/15.5", "95.2/73.9", 110.6, "152.2/79.9"))
df2
Run Code Online (Sandbox Code Playgroud)

Tar*_*Jae 2

一种方法可能是:

  1. 与组group_by
  2. separate在列ab
  3. mutate跨越ab并应用cumsum
  4. unitetidyr使用na.rm=TRUE参数从包中
library(dplyr)
library(tidyr)

df %>% 
  group_by(id) %>% 
  separate(number, c("a", "b"), sep="/", remove = FALSE, convert = TRUE) %>% 
  mutate(across(c(a,b), ~cumsum(.))) %>% 
  unite(csum, c(a,b), sep = '/', na.rm = TRUE)
Run Code Online (Sandbox Code Playgroud)
     id number    csum      
  <dbl> <chr>     <chr>     
1     1 30.6      30.6      
2     2 50.2/15.5 50.2/15.5 
3     2 45/58.4   95.2/73.9 
4     1 80        110.6     
5     2 57/6      152.2/79.9
Run Code Online (Sandbox Code Playgroud)