我想在删除该选择中的最小值和最大值后,计算数据框中每行的标准偏差.这是一个例子:
set.seed(1) dat <- data.frame(matrix(sample(c(1:100), 10, replace=TRUE), ncol=5))
我设法为每一行计算我感兴趣的列的sd(1:4):
dat <- transform(dat, sd = apply(dat[,1:4], 1, sd)) show(dat) X1 X2 X3 X4 X5 sd 1 27 58 21 95 63 33.95463 2 38 91 90 67 7 24.93324
但是,我无法弄清楚如何排除min(dat[1,1:4])
和max(dat[1,1:4])
计算之前sd()
.结果应该是这样的:
X1 X2 X3 X4 X5 sd 1 27 58 21 95 63 21.92031 # notice: sd calculated by hand using 'sd(c(27,58))' 2 38 91 90 67 7 16.26346 # notice: sd calculated by hand using 'sd(c(67,90))'
有人可以帮我弄这个吗?
您可以编写自定义函数来为您执行此操作.它接受一个向量,删除最小值和最大值,并返回剩余值的sd.当然,您也可以将其编写为匿名函数,但有时将函数分开使代码更具可读性.
sd_custom <- function(x){ x <- x[x!=min(x) & x!=max(x)] return(sd(x)) } dat$sd <- apply(dat[,1:4], 1, sd_custom) > dat X1 X2 X3 X4 X5 sd 1 27 58 21 95 63 21.92031 2 38 91 90 67 7 16.26346