2013-04-29 3 views
2

내 테이블에는 400 개의 클래스와 12 개의 열로 구성된 수천 개의 행이 있습니다.R에서 열 속성의 통계를 기반으로 행을 선택하는 방법은 무엇입니까?

이상적인 결과는 "z"열의 최대 값을 기반으로 모든 원본 열을 포함하는 400 개의 행 (각 클래스에 대해 1 행)이있는 테이블입니다. 여기

내 데이터의 예이며, 나는 여러 가지 조합을 시도 R.

 x   y   z cluster 
1 712521.75 3637426.49 19.46 12 
2 712520.69 3637426.47 19.66 12 * 
3 712518.88 3637426.63 17.37 225 
4 712518.4 3637426.48 19.42 225 * 
5 712517.11 3637426.51 18.81 225 
6 712515.7 3637426.58 17.8 17 
7 712514.68 3637426.55 18.16 17 * 
8 712513.58 3637426.55 18.23 50 * 
9 712512.1 3637426.62 17.24 50 
10 712513.93 3637426.88 18.08 50 

사용 만이 예에서 추출 된 2, 4, 7, 8 행이 필요 다음을 포함 :

tapply(data$z, data$cluster, max)  # returns only the max value and cluster columns 
    which.max(data$z)   # returns only the index of the max value in the entire table 

나는 또한 plyr 패키지를 통해 읽고, 그러나 해결책을 찾지 못했습니다.

답변

0

도움을 주셔서 감사합니다. aggregate()merge()이 완벽하게 작동했습니다.

중요한 점 : 그들은 하나 개의 클러스터에 동일한 최대 값을 가지고 있기 때문에, 모든 중복 포인트를 선택 - 집계() (-) 전용 클러스터 당 중복 포인트 중 하나지만에게, 병합을 선택했습니다.

이러한 점은 3D이므로 x 및 y 좌표를 고려할 때 중복되지 않으므로이 경우 이상적입니다.

df  <- read.table("data.txt", header=TRUE, sep=",") 
attach(df) 
names(df) 
[1] "Row"   "x"   "y"   "z"   "cluster" 
head(df) 
    Row  x  y  z  cluster 
1 1 712521.8 3637426 19.46   361 
2 2 712520.7 3637426 19.66   361 
3 3 712518.9 3637427 17.37   147 
4 4 712518.4 3637426 19.42   147 
5 5 712517.1 3637427 18.81   147 
6 6 712515.7 3637427 17.80   42 


new_table_a  <- aggregate(z ~ cluster, df, max) # output 400 rows, no duplicates 
new_table_b  <- merge(new_table_a, df)   # output 408 rows, includes duplicates of "z" 

head(new_table_b) 
     cluster  z Row  x  y 
1   1 20.44 6043 712416.2 3637478 
2   10 26.09 1138 712458.4 3637511 
3   100 19.39 6496 712423.4 3637485 
4   101 25.74 2141 712521.2 3637488 
5   102 17.33 2320 712508.2 3637484 
6   103 21.01 6908 712462.2 3637493 
2

아주 간단한 방법은 aggregatemerge을 사용하는 것입니다

> merge(aggregate(z ~ cluster, mydf, max), mydf) 
    cluster  z  x  y 
1  12 19.66 712520.7 3637426 
2  17 18.16 712514.7 3637427 
3  225 19.42 712518.4 3637426 
4  50 18.23 712513.6 3637427 

당신은 심지어 당신이 필요로하는 것을 얻기 위해 tapply 코드의 출력을 사용할 수 있습니다. 그냥 명명 된 벡터 대신 data.frame으로 만드십시오. 몇 가지 추가 옵션을 보려면


> merge(mydf, data.frame(z = with(mydf, tapply(z, cluster, max)))) 
     z  x  y cluster 
1 18.16 712514.7 3637427  17 
2 18.23 712513.6 3637427  50 
3 19.42 712518.4 3637426  225 
4 19.66 712520.7 3637426  12 

this question에서 답변을 참조하십시오.

+0

그냥 경고 : 당신이'통계 :: aggregate'가 아닌'래스터 :: aggregate'를 사용하십시오

여기 내 솔루션입니다. (병합을위한 것). 정상적인 환경에서는 이것이 문제가되지 않을 것입니다. 언젠가 당신을 속일 수도 있습니다 :-) –

+0

도움을 주셔서 대단히 감사합니다. aggregate() 및 merge()가 완벽하게 작동했습니다. 필자의 경우에는 tapply()를 사용한 두 번째 예제가 작동하지 않았고 비싸지 만 큰 테이블을 생성합니다. Aggregate()가 중복 값을 유지하고 병합하지 않는다는 것을 언급하는 것이 좋다. – Inga

+0

@Inga, 나는 여기서 당신의 의견을 완전히 이해하지 못한다. 그러나 나의 본능에 의하면, 당신은 'merge'에 대한 도움말 파일을 읽을 수있다. 더 나은 제어 방법. 특히'by' 인수 (각 데이터 집합에서 일치시킬 열로 사용할 열을 지정하는)는 여기에서 중복 값을 제어하는 ​​데 사용해야합니다.스택 오버플로에 오신 것을 환영합니다! – A5C1D2H2I1M1N2O1R2T1

관련 문제