R语言分组计算数据框列元素占组内总数百分比异常问题求助
问题分析与代码修正
你的问题核心是变量名错误和**prop.table参数误用**,导致百分比计算始终显示为100%。下面是具体的问题拆解和修正后的代码:
问题根源
- 未定义变量引用:你代码中使用了
proc和proc.2,但实际定义的频数对象是p和p.2,这导致prop.table计算时引用了错误的对象,从而得到错误的100%结果。 - 无效的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
相关产品推荐
相关产品推荐

