R中列表分组内各数值占比计算及for循环实现疑问
解决方案:按餐号计算Class值占比(单/多患者场景)
单患者场景(当前数据)
你已经通过split()完成了按餐号的分组,接下来可以通过以下for循环实现占比计算:
完整代码
# 获取分组(餐数)的数量 n <- length(df1) # 初始化结果数据框,用于存储每餐各Class的占比 result <- data.frame( Meal_Number = names(df1), Class_0 = numeric(n), Class_1 = numeric(n), Class_2 = numeric(n), Class_3 = numeric(n), stringsAsFactors = FALSE ) # 循环计算每类占比 for (i in 1:n) { # 提取当前餐的Class向量 current_class <- df1[[i]]$Class # 计算当前餐的样本总数 total <- length(current_class) # 计算各Class的占比(避免重复计算总长度) result$Class_0[i] <- sum(current_class == 0) / total result$Class_1[i] <- sum(current_class == 1) / total result$Class_2[i] <- sum(current_class == 2) / total result$Class_3[i] <- sum(current_class == 3) / total } # 查看最终结果 print(result)
关键说明
- 用
df1[[i]]而非df1[i]:split()返回的是列表,[[i]]直接取出第i个分组的完整数据框,[i]返回的是子列表,无法直接提取$Class。 - 初始化结果数据框:相比单独存储变量,结构化的结果更便于后续查看、导出和分析。
多患者场景(102位患者)
当数据包含Patient_ID列时,需要先按「患者+餐号」双重分组,再循环计算:
代码示例
# 按患者ID和餐号双重分组 df_grouped <- split(df, list(df$Patient_ID, df$Meal_Number)) # 获取总分组数 n_groups <- length(df_grouped) # 初始化多患者结果数据框 result_multi <- data.frame( Patient_ID = sapply(strsplit(names(df_grouped), "\\."), `[`, 1), Meal_Number = sapply(strsplit(names(df_grouped), "\\."), `[`, 2), Class_0 = numeric(n_groups), Class_1 = numeric(n_groups), Class_2 = numeric(n_groups), Class_3 = numeric(n_groups), stringsAsFactors = FALSE ) # 循环计算每一组的占比 for (i in 1:n_groups) { current_class <- df_grouped[[i]]$Class total <- length(current_class) result_multi$Class_0[i] <- sum(current_class == 0) / total result_multi$Class_1[i] <- sum(current_class == 1) / total result_multi$Class_2[i] <- sum(current_class == 2) / total result_multi$Class_3[i] <- sum(current_class == 3) / total } # 查看结果 print(result_multi)
更简洁的替代方案(无需for循环)
用dplyr包的分组统计可以省去循环,代码更简洁易读:
library(dplyr) result_dplyr <- df %>% group_by(Patient_ID, Meal_Number) %>% summarise( Class_0 = mean(Class == 0), Class_1 = mean(Class == 1), Class_2 = mean(Class == 2), Class_3 = mean(Class == 3), .groups = "drop" ) print(result_dplyr)
mean(Class == x)等价于sum(Class == x)/n(),直接实现占比计算。
内容的提问来源于stack exchange,提问作者user21528954
相关产品推荐
相关产品推荐

