Найдите самый высокий порог в 5 столбцах фрейма данных, чтобы получить n записей

Итак, у меня есть фрейм данных из 5 столбцов с 9031 наблюдением. Каждая запись столбца представляет собой процентильный ранг всех значений в столбце.

Моя цель — найти наивысший порог процентиля, который нужно применить ко всем пяти столбцам, чтобы получить n записей.

Итак, например, скажем, моя цель - сократить количество записей в моем фрейме данных до 1000 записей, каков самый высокий порог, который мне нужно применить ко всем 5 столбцам, чтобы получить 1000 записей?

  Variance_Five_Metrics$Zips    medium  medium.1  medium.2  medium.3   medium.4
  1                      00501 0.8395527 0.8671243 0.9894807 0.6567379 0.45875318
  2                      00544 0.8075518 0.8687853 0.9883734 0.6345920 0.45100210
  3                      01432 0.6124460 0.2460414 0.9701030 0.9103089 0.17107740
  4                      01434 0.7869560 0.3000775 0.9268077 0.8760935 0.11859152
  5                      01450 0.6642675 0.2451556 0.9919167 0.9585871 0.09600266

Итак, скажем выше, если первые пять записей (из 9031 записей) моего фрейма данных. Если я хочу сократить свой df ровно до 1000 записей, какую точку отсечки мне нужно применить ко всем 5 столбцам, чтобы получить ровно 1000 записей, где все 5 столбцов имеют значения ниже этой точки отсечки?

Я, вероятно, не очень хорошо объяснил это, но я был бы признателен за любое руководство

Спасибо


person ben890    schedule 16.01.2015    source источник
comment
Вы имеете в виду, что точка отсечки должна быть одинаковой для всех 5 столбцов или одно значение отсечки для каждого отдельного столбца?   -  person talat    schedule 16.01.2015
comment
точка отсечки должна быть одинаковой для всех 5 столбцов   -  person ben890    schedule 16.01.2015


Ответы (3)


Если я правильно понял вопрос, вы можете добиться этого с помощью простого минимума строк. Вот строка для получения значения отсечки:

quantile(apply(MAT, 1, min), p=1-(100/nrow(MAT)))

Вам нужно будет заменить «100» на ваше собственное количество разыскиваемых строк.


Краткое пояснение ниже

Итак, допустим, у вас есть матрица из 5 столбцов:

MAT <- matrix(rnorm(10000), ncol=5)

Вы хотите найти значение, которое после отсечения всех столбцов вместе оставит вам 100 строк:

n <- 100

Чтобы включить всю строку, все 5 ее столбцов должны быть выше порогового значения. Это то же самое, что просить, чтобы минимальное значение этой строки было выше отсечки.

MIN <- apply(MAT, 1, min)

Теперь мы можем найти процентиль для отсечки.

p <- 1 - (n/length(MIN))

Вам нужно 100 значений, поэтому приведенное выше просто 1 - 100/1000, что равно 0,9. Таким образом, ваше отсечение будет >= 0,9 процентиля.

получить процентиль:

q <- quantile(MIN, probs=p)

Это сработало?

sum(MAT[,1] > q & MAT[,2] > q & MAT[,3] > q & MAT[,4] > q & MAT[,5] > q)
[1] 100
person Karolis Koncevičius    schedule 16.01.2015
comment
Я считаю, что это близко, но каждая запись уже является квантилем, так что мне просто нужно сделать последний шаг? - person ben890; 16.01.2015

Я не уверен, что это именно то, что вы ищете. Я суммирую столбцы, беру верхнее n число, а затем предоставляю минимальные параметры для этого подмножества.

GetThresholds<-function(data,n){
  data$summed<-rowMeans(data[,2:6])
  data<-data[order(-data$summed),]
  data.small<-head(data,n=n)
  output<- c(min(data.small[,2]),
             min(data.small[,3]),
             min(data.small[,4]),
             min(data.small[,5]),
             min(data.small[,6]))
  names(output)<-names(data)[2:6]
  return(output)
}


GetThresholds(df,3)
> GetThresholds(df,3)
medium   medium.1   medium.2   medium.3   medium.4 
0.7869560 0.3000775 0.9268077 0.6345920 0.1185915 
person Andrew Taylor    schedule 16.01.2015
comment
Привет, Эндрю, извини за отсутствие конкретики, это почти то, что я хочу, но я хочу единый порог для всех 5 столбцов, если это имеет смысл. - person ben890; 16.01.2015

Пример использования dplyr:

library(dplyr)

d <- read.table(
  header = TRUE,
  text = "
zips    medium  medium.1  medium.2  medium.3   medium.4
00501 0.8395527 0.8671243 0.9894807 0.6567379 0.45875318
00544 0.8075518 0.8687853 0.9883734 0.6345920 0.45100210
01432 0.6124460 0.2460414 0.9701030 0.9103089 0.17107740
01434 0.7869560 0.3000775 0.9268077 0.8760935 0.11859152
01450 0.6642675 0.2451556 0.9919167 0.9585871 0.09600266
")

cutoff <- 3 # number of rows to keep (change to 1000 for your example)

d %>%
  mutate(p_min = pmin(medium, medium.1, medium.2, medium.3, medium.4)) %>%
  arrange(p_min) %>%
  .$p_min %>%
  '['(., cutoff)
person davechilders    schedule 16.01.2015