You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 14:52:16