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)
一种方法可能是:
group_by
separate
在列a
和b
mutate
跨越a
和b
并应用cumsum
unite
tidyr
使用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)