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

如何在R data.table中对变量截断后用rowMeans计算行均值?

问题

需要计算多个变量的行均值,但要先对变量值做上限截断处理(超过3的值替换为3)。以mtcars数据集为例,计算drat和wt的行均值,比如第一行需计算(3 + 2.62)/2而非原始的(3.9 + 2.62)/2。当前已有未截断的代码,想知道如何实现截断,且是否可以用rowMeans完成。

数据集示例

mpg cyl disp  hp drat    wt  qsec vs am gear carb
Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1

未截断的原始代码

mtcars = data.table(mtcars)
mtcars[,max_dart_wt := rowMeans(.SD), .SDcols = c("drat","wt")]

解决方案

完全可以借助rowMeans实现,核心是先对.SD内的变量做截断处理,再计算行均值,以下是两种简洁写法:

方法1:直接截断后计算均值

利用pmin函数将每个值与3取最小值,实现上限截断,再传入rowMeans:

library(data.table)
mtcars = data.table(mtcars)
mtcars[, truncated_mean := rowMeans(pmin(.SD, 3)), .SDcols = c("drat", "wt")]
  • pmin(.SD, 3)会遍历drat和wt的所有元素,将超过3的值替换为3,小于等于3的值保持不变
  • 直接将截断后的结果传给rowMeans,一步得到行均值

方法2:先保留截断变量再计算均值

如果需要单独存储截断后的变量,可以先修改.SD再计算:

mtcars[, c("drat_trunc", "wt_trunc") := lapply(.SD, function(x) pmin(x, 3)), .SDcols = c("drat", "wt")]
mtcars[, truncated_mean := rowMeans(.SD), .SDcols = c("drat_trunc", "wt_trunc")]

结果验证

第一行drat=3.9截断为3,wt=2.62不变,计算结果为(3 + 2.62)/2 = 2.81,运行代码后truncated_mean列第一行的值会是2.81,符合需求。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 09:30:50