2012-11-16 3 views
4

저는 R이 매우 새롭습니다. 주로 ggplot2 라이브러리를 사용하여 통계를 시각화하는 데 사용합니다. 이제 데이터 준비에 문제가 있습니다.데이터 프레임에서 가장 높은 값과 가장 낮은 값을 가진 행을 추출하십시오.

지정된 열에서 가장 높은 값과 가장 낮은 값을 가진 데이터 프레임에서 몇 개의 숫자 (2, 5 또는 10) 행을 제거하여 다른 데이터 프레임에 넣을 수있는 함수를 작성해야합니다. 두 가지 요소의 조합 (내 경우 : 매일 및 서버).

최대 요점은 다음과 같습니다 (MWE는 esoph 예제 데이터 집합을 사용함).

esoph<-esoph[with(esoph,order(-ncontrols)) ,] 

난 (각 연령대이 예에서), 각 인자 값 성/레코드를 표시 할 수있다 :

I 원하는 파라미터 (실시 예에서 ncontrols)에 따라 프레임을 정렬 한

by(data=esoph,INDICES=esoph$agegp,FUN=head,3) 
by(data=esoph,INDICES=esoph$agegp,FUN=tail,3) 

기본적으로 을 참조하십시오. 가장 높은 값과 가장 낮은 값은이지만, 다른 데이터 프레임으로 추출하는 방법과 기본 값에서 제거하는 방법을 모르겠습니다.

또한 위의 예에서 하나의 요소 (연령대)의 각 값에 대한 상단/하단 레코드를 볼 수 있지만 실제로는 두 개의 값인의 각 값에 대해 가장 높고 낮은 레코드를 알아야합니다. 예를 들면 agegpalcgp이 될 수 있습니다.

위의 단계가 정상적으로 작동하는지 잘 모르겠습니까? 아마도 plyr을 사용하면 더 잘 작동할까요? 나는 어떤 힌트라도 주시면 감사하겠습니다. 다음과 같이

+0

그래서 당신은 단순히 데이터 프레임의 첫 번째와 마지막 X 행을 제거하고 이러한 행을 포함하는 두 번째 데이터 프레임을 만들려면? –

+0

두 요소의 각 조합에 대한 첫 번째 및 마지막 값이 아니라 한 열의 값에 대한 최고 및 최저 값. 따라서 2 일 및 2 서버의 경우 day1에는 server1과 server2에 대해 최상위 및 최저 5, day2에는 server1과 server2의 경우 상위 5 개가 필요합니다. –

답변

3

예, plyr를 사용할 수 있습니다

esoph <- data.frame(agegp = sample(letters[1:2], 20, replace = TRUE), 
        alcgp = sample(LETTERS[1:2], 20, replace = TRUE), 
        ncontrols = runif(20)) 

ddply(esoph, c("agegp", "alcgp"), 
     function(x){idx <- c(which.min(x$ncontrols), 
          which.max(x$ncontrols)) 
        x[idx, , drop = FALSE]}) 
# agegp alcgp ncontrols 
# 1  a  A 0.03091483 
# 2  a  A 0.88529790 
# 3  a  B 0.51265447 
# 4  a  B 0.86111649 
# 5  b  A 0.28372232 
# 6  b  A 0.61698401 
# 7  b  B 0.05618841 
# 8  b  B 0.89346943 

ddply(esoph, c("agegp", "alcgp"), 
     function(x){idx <- c(which.min(x$ncontrols), 
          which.max(x$ncontrols)) 
        x[-idx, , drop = FALSE]}) 
# agegp alcgp ncontrols 
# 1  a  A 0.3745029 
# 2  a  B 0.7621474 
# 3  a  B 0.6319013 
# 4  b  A 0.3055078 
# 5  b  A 0.5146028 
# 6  b  B 0.3735615 
# 7  b  B 0.2528612 
# 8  b  B 0.4415205 
# 9  b  B 0.6868219 
# 10  b  B 0.3750102 
# 11  b  B 0.2279462 
# 12  b  B 0.1891052 

가능한 많은 대안이 들어있다 데이터가 이미 정렬 된 경우 headtail을 사용하지만이 방법이 효과적입니다.

1

기본 R 사용 :

newesoph <- esoph[esoph$ncontrols == ave(esoph$ncontrols,list(esoph$agegp,esoph$alcgp),FUN = max) 
     | esoph$ncontrols == ave(esoph$ncontrols,list(esoph$agegp,esoph$alcgp),FUN = min), ] 
관련 문제