如何在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
相关产品推荐
相关产品推荐

