2015-01-16 3 views
0

그래서 9031 개의 관측 값을 갖는 5 열의 데이터 프레임이 있습니다. 한 열의 각 레코드는 열의 모든 값에 대한 백분위 수 순위입니다.n 개의 레코드를 얻기 위해 5 열의 데이터 프레임에서 가장 높은 임계 값 찾기

저의 목표는 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 

그럼 내 데이터 프레임의 처음 5 개 레코드 (9031 개 레코드)가 위와 같다고 가정 해 보겠습니다. 내 df를 정확히 1000 개의 레코드로 축소하려면 5 개의 열 모두에이 컷오프 포인트 이하의 값이있는 정확히 1000 개의 레코드를 얻기 위해 5 개의 열 모두에 적용해야하는 컷오프 포인트가 무엇입니까?

나는 아마 잘 설명하지 않았지만, 나는 어떤 지침을

감사

+0

죄송합니다, 내 dataframe의 처음 다섯 개 개의 레코드를 포함하는 내 질문에 편집. – mangodreamz

+0

감사합니다. 지금은 훨씬 나아졌습니다. – akrun

+0

컷오프 포인트가 모든 5 개의 열 또는 개별 열마다 하나의 컷오프 값에 대해 동일해야한다는 것을 의미합니까? –

답변

1

내가이 질문을 이해했다면 간단한 행 단위로이 작업을 수행 할 수 있습니다. 다음은 컷오프 값을 얻기위한 선입니다.

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

원하는 "행 수"로 "100"을 입력해야합니다.

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

당신은 모든 컬럼에 차단 후 함께 당신에게 100 개 행을 떠날 것이라는 값을 찾으려면 :

아래


짧은 설명은 그래서 당신이 5 열의 매트릭스가 있다고 가정 해 보자 :

전체 행이 포함되도록하려면 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) 
관련 문제