基于行按列项算术运算汇总数据框:计算每日(Heads-Tails)/(Heads+Tails)比率
解决方法
你可以用两种高效的方式实现需求,避免手动逐个日期计算:
方法一:直接分组计算(更简洁高效)
在按日期分组后,直接通过条件求和得到每日Heads和Tails的总和,再计算比率:
library(tidyverse) # 生成原始数据(你的代码) set.seed(1) start <- mdy("01/01/2022") end <- start + as.difftime(4, units = "days") days <- seq(from = start, to = end, by = 1) days <- sample(days, 100, replace = T) flip <- sample(c("Heads", "Tails"), 100, replace = TRUE) numbers <- rchisq(100, 30) df <- tibble(days, numbers, flip) # 核心计算代码 result <- df %>% group_by(days) %>% summarize( heads_total = sum(numbers[flip == "Heads"]), tails_total = sum(numbers[flip == "Tails"]), ratio = (heads_total - tails_total) / (heads_total + tails_total) ) %>% ungroup() # 查看结果 print(result)
这种方法无需额外的数据格式转换,一步完成分组、求和与比率计算,处理大量数据时效率更高。
方法二:先汇总再转宽表
如果你更习惯先按日期和flip分组求和,再转换为宽表计算比率,可以这样做:
result <- df %>% group_by(days, flip) %>% summarize(total = sum(numbers)) %>% ungroup() %>% # 将Heads和Tails转为列,缺失值用0填充(避免某天只有一种结果的情况) pivot_wider(names_from = flip, values_from = total, values_fill = 0) %>% mutate(ratio = (Heads - Tails) / (Heads + Tails)) print(result)
运行后你会得到每个日期对应的比率,和你手动计算的结果完全一致(因为设置了set.seed(1),结果可复现)。
内容的提问来源于stack exchange,提问作者AColoredReptile
相关产品推荐
相关产品推荐

