【问题标题】:How to order levels in a variable based on both the sum of value in a variable and the levels in another variable?如何根据变量中值的总和和另一个变量中的水平对变量中的水平进行排序?
【发布时间】:2013-06-13 10:09:59
【问题描述】:

我有一个看起来像这样的数据框,我正在为 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$v2mydata$v1 的“强烈同意”级别内的最高值对mydata$v3 中的级别进行排序,我将得到的顺序是:@987654328 @、var3var2 因为mydata$v2 中的值是 83.1、19.6、11.8。

另一个例子:例如,如果我想根据mydata$v2 中的值的总和在mydata$v1 中的“非常同意”和“同意”级别内对mydata$v3 中的级别进行排序,我会得到的顺序将是:var1, var2, var3 因为mydata$v2 中的值是 (83.1+14.9)=98, (11.8+36.5)=48.3, (19.6+12)=31.6

我自己不知道如何处理这个问题。而且,我处理了很多这样的帧,所以代码必须进入一个函数

编辑:

在这两个例子中,我想要的结果是原始的 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"

在示例二中我有:

                  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"

请注意,在示例二中,我拥有的和想要的是相同的,但我有很多 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 内的级别。
  • 对不起,如果这个问题有点神秘,我尽量做到具体
  • 但是现在,对于第一个示例,“非常同意”的值没有排序:v2 是 83.1、11.8、19.6,v3 是 var1、var2、var3 而不是 var1、var3、var2。
  • 不,这些值没有排序,我认为最终不需要。它用于ggplot2中的堆叠条形图,所以我想要v2和v1的原始顺序。 v3 中的级别是我在 ggplot 中的 x 变量,所以是的,它具有 var1、var2、var3 的顺序。我希望它根据 v2 中的值(从最高值到最低值)进行相应更改

标签: r sorting r-factor


【解决方案1】:

这是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

【讨论】:

    猜你喜欢
    • 2021-09-10
    • 2022-11-23
    • 1970-01-01
    • 2019-11-03
    • 1970-01-01
    • 2021-06-14
    • 2015-10-04
    • 2014-04-30
    • 1970-01-01
    相关资源
    最近更新 更多