我希望在删除该选择中的最小值和最大值后,计算数据框中每行的标准偏差。这是一个例子:
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))'
有人可以帮我这个吗?
答案 0 :(得分:5)
您可以编写自定义函数来为您执行此操作。它接受一个向量,删除最小值和最大值,并返回剩余值的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
答案 1 :(得分:3)
你可以试试这个:
dat$sd <- apply(dat[1:4], 1, function(x) sd(x[-c(which.min(x), which.max(x))] ))
dat
X1 X2 X3 X4 X5 sd
1 27 58 21 95 63 21.92031
2 38 91 90 67 7 16.26346
答案 2 :(得分:3)
我们可以通过将sd(x)
更改为自定义函数
dat <- transform(dat, sd = apply(dat[,1:4], 1, function(x) sd(x[x<max(x) & x>min(x)])))
答案 3 :(得分:2)
或另一个选项range
setdiff
dat$sd <- apply(dat[1:4], 1, function(x) sd(setdiff(x,range(x))))
dat$sd
#[1] 21.92031 16.26346