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)

私の質問は:の値と のレベルのmydata$v3両方に基づいてのレベルを並べ替えるにはどうすればよいですか?mydta$v2mydata$v1

例: たとえば、「強く同意する」レベル内の最高値mydata$v3に基づいてレベルを並べ替えたい場合、次のようになります。mydata$v2mydata$v1var1var3var2mydata$v2

別の例: たとえば、「強く同意する」と「同意する」のレベル内の値のmydata$v3合計に基づいてレベルを並べ替えたい場合、次のようになります。+14.9)=98、(11.8+36.5)=48.3、(19.6+12)=31.6mydata$v2mydata$v1var1var2var3mydata$v2

私はこれに自分でアプローチする方法がわかりません。また、私はこのような多くのフレームを扱っているので、コードは関数に入る必要があります

編集:

両方の例で、目的の結果は元の 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" "var3" "var2"

例 2 では、次のようにしています。

                  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"

例 2 では、私が持っているものと欲しいものは同じですが、そうではない data.frames がたくさんあることに注意してください。

私が探しているのは、複雑なバージョンの

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])
4

1 に答える 1

0

これが解決策aggregateです:

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
于 2014-05-21T01:02:19.707 に答える