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

R语言分组计算数据框列元素占组内总数百分比异常问题求助

问题分析与代码修正

你的问题核心是变量名错误和**prop.table参数误用**,导致百分比计算始终显示为100%。下面是具体的问题拆解和修正后的代码:

问题根源

  1. 未定义变量引用:你代码中使用了proc和proc.2,但实际定义的频数对象是p和p.2,这导致prop.table计算时引用了错误的对象,从而得到错误的100%结果。
  2. 无效的margin参数:对于一维的table对象,prop.table(..., 1)中的margin=1没有意义,一维表格的prop.table()默认就是计算各元素占分组总数的比例,无需额外指定margin。

修正后的代码

library(purrr)

# 原始数据
data <- structure(list(GROUP = c(1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L), col1 = c("S", "S", "S", "S", "F", "F", "F", "F", "F"), col2 = c("a", "a", "s", "s", "s", "s", "s", "s", "s")), class = "data.frame", row.names = c(NA, -9L))

comb <- list(c(2, 3))

quantity.elem <- function(dat) {
  do.call(rbind, lapply(comb, function(x) {
    # 获取目标列的名称和数据
    col1 <- dat[[x[1]]]
    col2 <- dat[[x[2]]]
    
    # 计算每列的频数
    p <- table(col1)
    p.2 <- table(col2)
    
    # 计算分组内的百分比:频数占分组总数的比例*100
    p_pct <- round(prop.table(p) * 100, 1)
    p2_pct <- round(prop.table(p.2) * 100, 1)
    
    # 拼接单元素的"名称:数量(百分比)"格式
    col1_strs <- paste0(names(p), ": ", as.numeric(p), " (", as.numeric(p_pct), "%)")
    col2_strs <- paste0(names(p.2), ": ", as.numeric(p.2), " (", as.numeric(p2_pct), "%)")
    
    # 按需求拼接最终字符串
    col_str <- paste(paste(col1_strs, col2_strs, sep = "-"), collapse = " ")
    
    # 返回结果数据框
    data.frame(
      NAME = sprintf('Group %s by Group %s', x[1], x[2]),
      quan = col_str
    )
  }))
}

# 按GROUP分组计算
result <- purrr::map_df(split(data, data$GROUP), quantity.elem, .id = 'Group')

# 查看输出
print(result)

运行结果

Group                          NAME                                quan
1     1 Group 2 by Group 3 F: 3 (60%)-a: 1 (20%) S: 2 (40%)-s: 4 (80%)
2     2 Group 2 by Group 3 F: 2 (50%)-a: 1 (25%) S: 2 (50%)-s: 3 (75%)

这个结果完全匹配你的期望输出,同时代码逻辑更清晰,也避免了变量名错误的问题。

内容的提问来源于stack exchange,提问作者GOGA GOGA

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 07:19:05