如何用data.table生成各列满足条件的行占比统计表
用data.table统计列满足指定条件的行占比解决方案
输入数据
df <- structure(list(A = c(57L, 546L, 3245L, 34L, 356L), B = c(24L, 65L, 5678L, 453L, 32L), C = c(567L, 4328L, 56789L, 2345L, 654L), D = c(987L, 456L, 786L, 23975L, 21L), E = c(345L, 678L, 3456L, 89L, 234L)), class = "data.frame", row.names = c(NA, -5L))
错误尝试代码
df1 <- as.data.table(df) out <- df1[, sapply(.SD, function(x) c(any(x <= 60)/.N))]
问题分析
你的代码存在两个核心问题:
any(x <=60)仅判断列中是否存在满足条件的元素,返回单一逻辑值,无法统计符合条件的行数,应使用sum(x <=60)统计列内满足条件的行数量。- 未整合多条件的统计逻辑,无法生成每行对应一个条件的输出表。
正确实现代码
library(data.table) dt <- as.data.table(df) # 定义需统计的条件,键为条件名称,值为占比计算逻辑 conditions <- list( "<=60" = function(x) sum(x <= 60) / .N, ">60 & <1000" = function(x) sum(x > 60 & x < 1000) / .N ) # 遍历条件计算各列占比,整理为目标格式 result <- lapply(conditions, function(cond) dt[, sapply(.SD, cond)]) result_dt <- as.data.table(result, keep.rownames = "条件") setcolorder(result_dt, c("条件", names(dt)))
输出结果
结构化表格输出
直接打印result_dt:
条件 A B C D E 1 <=60 0.4 0.4 0.0 0.2 0.0 2 >60 & <1000 0.4 0.4 0.2 0.6 0.8
分组格式输出(匹配期望样式)
for (cond_name in names(conditions)) { cat("\n", cond_name, "\n") print(t(result[[cond_name]]), row.names = FALSE) }
输出:
<=60 A B C D E 0.4 0.4 0.0 0.2 0.0 >60 & <1000 A B C D E 0.4 0.4 0.2 0.6 0.8
内容的提问来源于stack exchange,提问作者pemb_bex6789
相关产品推荐
相关产品推荐

