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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 01:52:01