在R中计算达到列总值80%阈值所需的数值数量
解决方案:计算累计占比达80%所需的数值个数
没问题,我来帮你调整这段R代码,实现你想要的功能——对每一列从大到小排序后,找到累计占比首次达到列总值80%所需的最小数值个数。
修改后的完整代码
set.seed(12345) df1 = data.frame(replicate(10,sample(0:500,1000,rep=TRUE))) df2 = data.frame(replicate(10,sample(0:500,1000,rep=TRUE))) list_dfs = list(df1, df2) # 替换原变量名list,避免和R内置函数冲突 # 核心逻辑修改部分 do.call(cbind, lapply(list_dfs, function(x) { # 计算每个数值占对应列总和的比例 col_props <- x / colSums(x)[col(x)] # 对每列执行:降序排序→计算累计占比→找首次达80%的位置 sapply(col_props, function(col) { sorted_props <- sort(col, decreasing = TRUE) cumulative_proportion <- cumsum(sorted_props) # 取第一个累计占比≥0.8的索引,就是所需的数值个数 which(cumulative_proportion >= 0.8)[1] }) }))
关键修改说明
- 变量名优化:把原代码的
list改成list_dfs,因为list是R的内置函数,用它做变量名容易引发意外错误,算是个实用的小细节~ - 核心逻辑替换:原代码是直接取前5个值的占比总和,现在改成了:
- 对列内数值的占比进行降序排序
- 用
cumsum()计算累计占比 - 通过
which(cumulative_proportion >= 0.8)[1]找到第一个累计占比达标位置,这个位置就是我们要的数值个数
- 结果可复现:因为保留了
set.seed(12345),你每次运行这段代码都会得到相同的结果,方便测试和验证。
内容的提问来源于stack exchange,提问作者nymuffin
相关产品推荐
相关产品推荐

