Просканируйте столбец, чтобы найти значение по определенному значению, и переместите весь столбец в новый кадр данных в R - PullRequest
0 голосов
/ 29 мая 2018
x<-matrix(c(0.00009852, -0.00393314, -0.00049056, -0.00117636, 
-0.00283716,  0.00136866, -0.00536613, -0.00068090, 0.01528542, 
0.01221890, -0.00309366, 0.00379356,-0.00159904, -0.00259300, 
-0.00635427,  0.00446363,0.00119367,  0.00079657,  0.00419246,  
0.00090068,0.00160321,0.00623682, -0.00010090, -0.00070604),ncol=4)

x<-data.frame(x)
names(x)<-c("active","inactive","injured","rehab")


   active        inactive     injured      rehab
1 0.00009852   -0.00536613  -0.00159904  0.00419246
2 -0.00393314  -0.00068090  -0.00259300  0.00090068
3 -0.00049056  0.01528542   -0.00635427  0.00160321
4 -0.00117636  0.01221890    0.00446363  0.00623682
5 -0.00283716  -0.00309366   0.00119367 -0.00010090
6 0.00136866   0.00379356     0.00079657 -0.00070604

Итак, у меня есть этот набор данных, который называется (x).Я хочу

1) найти выброс каждого из столбцов

2) отсканировать столбец, если есть какое-либо значение, которое находится выше / ниже значения выброса

3)переместите столбец с выбросом в новый фрейм данных с именем y.

Задача 1, я использую следующее:

quantile1<-function(k){
quantile(k, 0.25)+IQR(k)
}

quantile3<-function(k){
quantile(k,0.75)+IQR(k)
}

lower_outlier<-apply(x, 2, quantile1)
upper_outlier<-apply(x, 2, quantile3)

View(t(lower_outlier))
   active       inactive    injured     rehab
-0.000048750  0.010112565 0.001094395  0.003545148

View(t(upper_outlier))
   active       inactive    injured     rehab
0.00232446    0.0227156    0.0045333   0.0069408

Так что теперь у меня есть верхний и нижний пределы выбросов для каждого из столбцов,Как мне перейти к заданию 2 и 3?Я считаю, что один из подходов - это что-то вроде

x <- x[x <= value]

, но я не уверен.Любой совет высоко ценится

1 Ответ

0 голосов
/ 29 мая 2018

Мы можем создать логическую матрицу с реляционными операторами после того, как сделаем одинаковыми длины объектов сравнения (путем репликации), а затем получим colSums матрицы, отрицая (!), так что столбцы, имеющие 0 выбросов, будутTRUE и другие FALSE

i1 <- !colSums(x > upper_outlier[col(x)] | x < lower_outlier[col(x)])

Подмножество столбцов набора данных на основе индекса

y <- x[, i1, drop = FALSE]
...