2014-12-18 3 views
2

У меня есть вектор 100 отсортированных значенийУдаления значения из отсортированного вектора

x=rnorm(100) 
x_sort=sort(x) 

Как удалить 2,5% (к примеру) от верхней ун нижней стороны x_sort?

+0

Это будет трудно в этом случае, чтобы удалить ровно 2,5% –

+0

скажем 5% или 10% независимо от – Math

ответ

0

Вот один вариант:

m <- 5 # percentage to be deleted from each side 
l <- length(x_sort) 
n <- l * m/100 
y <- head(tail(x_sort, l - n), l - n*2) 

length(x_sort) 
#[1] 100 
length(y) 
#[1] 90 

Вы можете округлять значение из n в целые или использовать floor или ceiling функции, например, n <- round(l * m/100), чтобы убедиться, что вы не пытаетесь удалить, например, 2.3 элемента x.

Другой подход:

m <- 5 # percentage to be deleted from each side 
l <- length(x_sort) 
n <- round(l * m/100) 
y2 <- x_sort[seq.int(n+1L, l-n, 1L)] 

ли они возвращают то же самое?

all.equal(y, y2) 
#[1] TRUE 
+0

Большое спасибо, он работает – Math

+0

Добро пожаловать, @Math. Я добавил еще один вариант. –

2

Использование quantile способ:

x=rnorm(100) 
x_sort=sort(x) 

x_sort2 <- x_sort[ x_sort > quantile(x_sort,0.025) & x_sort < quantile(x_sort,0.975)] 
#x_sort2 will be a subset of x_sort starting from the 2.5th quantile and finishing at the 97.5th on this occassion. 
#in bigger datasets it's extremely accurate (now you only have 100 values and you cannot pick the 2.5th for example).  

> length(x_sort) 
[1] 100 
> length(x_sort2) 
[1] 94 

Вы можете заменить 0.025 или 0.975 с точно значениями, которые вы хотите, чтобы быть вашим ниже или ваш верхний предел, и даже добавить функцию, чтобы сделать это для вас.

Что-то вроде этого, может быть:

excluder <- function(myvec,a,b) { myvec[myvec > quantile(myvec,a) & myvec < quantile(myvec,b)] } 
#with myvec being your vector, a the lower limit and b the upper limit  

x_sort3 <- excluder(x_sort,0.025,0.975) 

> length(x_sort3) 
[1] 94 
+0

большое спасибо – Math

+0

Вы снова добро пожаловать! – LyzandeR

Смежные вопросы