Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何根据一个变量中的值和另一个变量中的级别对变量中的级别进行排序?_R_Sorting_R Factor - Fatal编程技术网

R 如何根据一个变量中的值和另一个变量中的级别对变量中的级别进行排序?

R 如何根据一个变量中的值和另一个变量中的级别对变量中的级别进行排序?,r,sorting,r-factor,R,Sorting,R Factor,我有一个像这样的数据框,我正在准备一个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 agr

我有一个像这样的数据框,我正在准备一个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)
但我想结束的是这个

                  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])
下面是一个使用聚合的解决方案:


什么的顺序,因子中的级别?是的,我需要对因子mydata$v3中的级别进行排序。抱歉,如果问题有点神秘,我尝试尽可能具体,但是现在,对于第一个示例,Strongly agree的值没有顺序:v2是83.1、11.8、19.6,v3是var1、var2、var3而不是var1、var3,不,这些值不是有序的,我认为最终也不需要。它用于ggplot2中的堆叠条形图,所以我需要v2和v1的原始顺序。v3中的级别是我在ggplot中的x变量,所以是的,它的顺序是var1,var2,var3。我希望它相应地改变,v2中的值,从最高值到最低值
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])
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