在R语言中按样本分组计算每日观测值的累积求和
解决方案:计算样本每日观测数及累积和(R语言)
方法一:使用dplyr包(推荐,新手友好)
dplyr是R中常用的数据处理包,语法简洁易读,适合快速实现需求。
步骤1:构造示例数据(可直接复制运行)
df <- data.frame( sampleID = c("sample-1", "sample-1", "sample-1", "sample-1", "sample-1", "sample-1", "sample-2", "sample-2", "sample-2", "sample-2", "sample-2", "sample-3", "sample-3", "sample-3", "sample-3"), day = c(2,3,3,6,6,6,4,4,8,10,12,1,1,5,5), obs = c("blue", "red", "yellow", "green", "blue", "black", "blue", "yellow", "orange", "black", "red", "white", "black", "orange", "blue") )
步骤2:数据处理代码
library(dplyr) result <- df %>% # 按样本ID和观测日分组 group_by(sampleID, day) %>% # 统计当日观测数,保留样本ID分组用于后续计算 summarise(n_obs = n(), .groups = "drop_last") %>% # 计算每个样本的累积观测数 mutate(n_cumulative = cumsum(n_obs)) %>% # 取消分组,转为普通数据框 ungroup() # 输出结果 print(result)
代码解释
group_by(sampleID, day):将数据按样本和日期拆分,确保后续统计的是每个样本单日的观测数summarise(n_obs = n(), .groups = "drop_last"):用n()统计每组的行数(即当日观测数),.groups = "drop_last"保留样本ID的分组,方便后续计算累积和mutate(n_cumulative = cumsum(n_obs)):在每个样本分组内,对单日观测数做累积求和ungroup():取消分组,让结果回归普通数据框格式,方便后续操作
方法二:使用基础R(无需额外安装包)
如果不想安装dplyr包,也可以用基础R函数实现:
# 步骤1:统计每个样本每日观测数 df_agg <- aggregate(obs ~ sampleID + day, data = df, FUN = length) colnames(df_agg)[3] <- "n_obs" # 步骤2:计算每个样本的累积观测数 df_agg$n_cumulative <- ave(df_agg$n_obs, df_agg$sampleID, FUN = cumsum) # 步骤3:按样本和日期排序,匹配期望输出顺序 df_agg <- df_agg[order(df_agg$sampleID, df_agg$day), ] # 输出结果 print(df_agg)
代码解释
aggregate(obs ~ sampleID + day, data = df, FUN = length):按样本和日期分组,统计观测数量ave(df_agg$n_obs, df_agg$sampleID, FUN = cumsum):通过ave函数按样本分组,对单日观测数计算累积和order(df_agg$sampleID, df_agg$day):确保结果按样本ID和日期升序排列,与期望输出一致
内容的提问来源于stack exchange,提问作者sannika
相关产品推荐
相关产品推荐

