2016-01-06 182 views
2

我想要在删除该选择中的最小值和最大值之后,计算数据框中每行的标准偏差。这里有一个例子:R:在删除最小值和最大值之后,通过选择的列计算每行中的标准差

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

有人可以帮助我?

+1

你有什么期望是'C的结果(2,2,3,4,20,20)'?请编辑你的问题! – jogo

+0

@jogo我在我的数据中有很多小数,所以你的情况下,有相同的值不会成为一个问题。 – piptoma

回答

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 
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 
3

我们可以通过改变sd(x)到自定义功能

dat <- transform(dat, sd = apply(dat[,1:4], 1, function(x) sd(x[x<max(x) & x>min(x)]))) 
2

或者其他选项来修改你的代码是rangesetdiff

dat$sd <- apply(dat[1:4], 1, function(x) sd(setdiff(x,range(x)))) 
dat$sd 
#[1] 21.92031 16.26346 
相关问题