2013-06-13 2 views
1

나는 내가 ggplot을 준비하고있어 데이터 프레임과 같이 찾고 있습니다변수의 값의 합계와 다른 변수의 레벨을 기반으로 변수의 수준을 정렬하는 방법은 무엇입니까?

txt <- "v1 v2 v3 
'Strongly agree' 83.1 var1 
'Agree' 14.9 var1 
'Disagree' 1.5 var1 
'Strongly disagree' 0.6 var1 
'Strongly agree' 11.8 var2 
'Agree' 36.5 var2 
'Disagree' 17.7 var2 
'Strongly disagree' 43.8 var2 
'Strongly agree' 19.6 var3 
'Agree' 12 var3 
'Disagree' 31.6 var3 
'Strongly disagree' 36.8 var3" 

mydata <- read.table(textConnection(txt), sep = " ", header = TRUE) 

내 질문은 : 어떻게 mydta$v2의 값과 mydata$v1의 수준 모두를 기반으로 mydata$v3의 수준을 주문하려면?

예 : 예를 들어 나는 수준 mydata$v1에 '매우 동의'내 mydata$v2에서 가장 높은 값을 기준으로 mydata$v3의 수준을 주문하려는 경우 내가 얻을 것 순서는 다음과 같습니다 때문에 var1, var3, var2mydata$v2의 값은 83.1, 19.6, 11.8입니다.

또 다른 예 : 예를 들어 내가 '전적으로 동의'내가 얻을 것이 순서 일 것 mydata$v1에 '동의'수준에서 mydata$v2에서 값의 합을 기준으로 mydata$v3의 수준을 주문하려는 경우 : var1를, mydata$v2의 값이 (83.1 + 14.9) = 98 (11.8 + 36.5) = 48.3 (+ 12 19.6) =

31.6입니다 var2, var3 때문에 어떻게 자신이 접근하는 아무 생각이 없습니다. 두 예에서

, 내가 갈거야 결과 원래 data.frame은 다음과 같습니다 또한, 나는

편집 함수로 가야이 너무 코드와 같은 프레임을 많이 처리 mydata $ v3의 수준 만 변경되었습니다.

그래서 예 1에서 내가 가진 :

    v1 v2 v3 
1  Strongly agree 83.1 var1 
2    Agree 14.9 var1 
3   Disagree 1.5 var1 
4 Strongly disagree 0.6 var1 
5  Strongly agree 11.8 var2 
6    Agree 36.5 var2 
7   Disagree 17.7 var2 
8 Strongly disagree 43.8 var2 
9  Strongly agree 19.6 var3 
10    Agree 12.0 var3 
11   Disagree 31.6 var3 
12 Strongly disagree 36.8 var3 

levels(mydata$v3) 
[1] "var1" "var2" "var3" 

하지만 내가 함께 종료 할 것은 이것이다.

    v1 v2 v3 
1  Strongly agree 83.1 var1 
2    Agree 14.9 var1 
3   Disagree 1.5 var1 
4 Strongly disagree 0.6 var1 
5  Strongly agree 11.8 var2 
6    Agree 36.5 var2 
7   Disagree 17.7 var2 
8 Strongly disagree 43.8 var2 
9  Strongly agree 19.6 var3 
10    Agree 12.0 var3 
11   Disagree 31.6 var3 
12 Strongly disagree 36.8 var3 

levels(mydata$v3) 
[1] "var1" "var2" "var3" 

을하지만 원하는 : 예를 두 가지에서

    v1 v2 v3 
1  Strongly agree 83.1 var1 
2    Agree 14.9 var1 
3   Disagree 1.5 var1 
4 Strongly disagree 0.6 var1 
5  Strongly agree 11.8 var2 
6    Agree 36.5 var2 
7   Disagree 17.7 var2 
8 Strongly disagree 43.8 var2 
9  Strongly agree 19.6 var3 
10    Agree 12.0 var3 
11   Disagree 31.6 var3 
12 Strongly disagree 36.8 var3 

levels(mydata$v3) 
[1] "var1" "var3" "var2" 

내가 가진

    v1 v2 v3 
1  Strongly agree 83.1 var1 
2    Agree 14.9 var1 
3   Disagree 1.5 var1 
4 Strongly disagree 0.6 var1 
5  Strongly agree 11.8 var2 
6    Agree 36.5 var2 
7   Disagree 17.7 var2 
8 Strongly disagree 43.8 var2 
9  Strongly agree 19.6 var3 
10    Agree 12.0 var3 
11   Disagree 31.6 var3 
12 Strongly disagree 36.8 var3 

levels(mydata$v3) 
[1] "var1" "var2" "var3" 

공지 사항, 즉 예를 들어 내가 가진 무엇을 내가 원하는 것은 동일하지만 나는이 것을 두에 이것이 사실이 아닌 많은 데이터. 프레임. 내가 생각 무엇을 찾고 있어요

는 여기 aggregate있는 솔루션이다

factor(maydata$v3, levels(mydata$v3)[EXAMPLE1: order after value in v2 within 1 level in v1 /EXAMPLE2: order after sum of value within 2 levels in v1]) 
+1

어떤 요소 내에서 수준을 정할 수 있습니까? –

+0

예 레벨 mydata $ v3 내의 레벨을 주문해야합니다. – Einnor

+0

죄송합니다. 약간의 질문이있는 경우 미심쩍어합니다. – Einnor

답변

0

의 복잡한 버전 :

f <- function(mydata, v1.val) { 
    # Value or sum of v2 within the selected rows 
    sums <- aggregate(v2 ~ v3, data=mydata[mydata$v1 %in% v1.val,], FUN=sum) 

    # Decreasing order of the sum of v2 values, or the only v2 value, for each level of v3 
    ord <- order(sums$v2, decreasing=TRUE) 

    # Build a new factor with the proper levels and assign it to v3 
    fac <- factor(mydata$v3, levels=sums$v3[ord]) 

    mydata$v3 <- fac 
    return(mydata) 
} 

데이터 프레임은 위와 같이 보이지만 요인 수준은 원하는대로 :

> f(mydata, 'Strongly agree')$v3 
[1] var1 var1 var1 var1 var2 var2 var2 var2 var3 var3 var3 var3 
Levels: var1 var3 var2 

> f(mydata, c('Strongly agree', 'Agree'))$v3 
[1] var1 var1 var1 var1 var2 var2 var2 var2 var3 var3 var3 var3 
Levels: var1 var2 var3 
관련 문제