2015-01-16 39 views
0

所以我有一個5列的數據框,其中有9031個觀察值。列的每個記錄都是列中所有值的百分位數。查找5列數據幀的最高閾值以獲得n條記錄

我的目標是找到適用於所有五列的最高百分比閾值以獲得n條記錄。

例如,假設我的目標是將數據框中的記錄數減少到1000條記錄,爲了獲得1000條記錄,我需要應用於所有5列的最高閾值是多少?

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列的截斷點應用於所有5列,以便精確地獲得1000條記錄,其中所有5列的值都低於此截止點?

我可能沒有解釋這是很好的,但我會很感激的任何指導

感謝

+0

對此深感抱歉,我編輯我的問題,其中包括前五個記錄我的數據幀的。 – mangodreamz

+0

謝謝,現在看起來好多了。 – akrun

+0

您的意思是所有5列的截止點必須相同,或者每個柱子的截止值是相同的? –

回答

1

如果我理解了正確的問題,那麼您可以通過簡單的按行最小化來實現此目的。這裏是一條線來獲得截止值:

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 
+0

我相信這很接近,但是每個記錄已經是一個分位數,所以我只需要走最後一步? – mangodreamz

0

我不知道如果這正是你所期待的。我總結列,取頂部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 
+0

嘿,安德魯,對於我缺乏特殊性感到抱歉,這幾乎是我想要的,但如果有意義的話,我希望所有5列的統一閾值。 – mangodreamz

0

使用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)