R数据表条件平均值

6yoyoihd  于 2023-02-06  发布在  其他
关注(0)|答案(2)|浏览(123)

我想计算几个变量的平均值,但要限制和限制其值。
例如,在mtcars中,计算drat和wt变量的平均值,但限制大于3的任何值。因此,如果drat为3.90,则仅使用3作为平均值。
第一行将是(3+2.62)/2,而不是(3.9+2.62)/2。

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

这是无上限的。我怎么把它上限为3呢?有没有办法用rowMeans做呢?

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

euoag5mw1#

下面是smth快速和肮脏:

rowMeans_p <- function(DT, p = 3) {
  tmp <- lapply(DT, \(x) pmin(x, p)) |> 
    Reduce(f = "+") # changed from do.call for scalability
  tmp / ncol(DT)
}

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

head(mtcars)
#      mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb max_dart_wt
#    <num> <num> <num> <num> <num> <num> <num> <num> <num> <num> <num>       <num>
# 1:  21.0     6   160   110  3.90 2.620 16.46     0     1     4     4      2.8100
# 2:  21.0     6   160   110  3.90 2.875 17.02     0     1     4     4      2.9375
# 3:  22.8     4   108    93  3.85 2.320 18.61     1     1     4     1      2.6600
# 4:  21.4     6   258   110  3.08 3.215 19.44     1     0     3     1      3.0000
# 5:  18.7     8   360   175  3.15 3.440 17.02     0     0     3     2      3.0000
# 6:  18.1     6   225   105  2.76 3.460 20.22     1     0     3     1      2.8800
bejyjqdl

bejyjqdl2#

我意识到最快的方法是创建一个索引,如果列很少,则按“id”执行操作。

mtcars$idx = 1:nrow(mtcars)
mtcars[,max_dart_wt := mean(c(min(drat,3),min(wt,3)),na.rm=TRUE), by = "idx"]

相关问题