R:在删除最小值和最大值后,在选择的列上计算每行中的SD

时间:2016-01-06 16:13:39

标签: r dataframe

我希望在删除该选择中的最小值和最大值后,计算数据框中每行的标准偏差。这是一个例子:

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))'

有人可以帮我这个吗?

4 个答案:

答案 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