【问题标题】:Order data frame columns by factor - factor order needs to be reordered按因子排序数据框列 - 因子顺序需要重新排序
【发布时间】:2016-03-14 19:40:13
【问题描述】:

我需要根据数据框的两列制作条形图。对于正确的顺序,我需要重新排序一列的因子,并用它重新排序数据框的其余部分。我尝试重新排序因子,但其余列保持不变。如何对整个数据框进行排序?我将展示我对 iris 数据所做的事情(请注意,我的数据实际上有两个标称列)

> d<-iris
> head(d)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa
> d$Species<-factor(d$Species, labels=c("virginica","setosa","versicolor"))
> head(d)
  Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
1          5.1         3.5          1.4         0.2 virginica
2          4.9         3.0          1.4         0.2 virginica
3          4.7         3.2          1.3         0.2 virginica
4          4.6         3.1          1.5         0.2 virginica
5          5.0         3.6          1.4         0.2 virginica
6          5.4         3.9          1.7         0.4 virginica
> 

如您所见,Species 列按我想要的方式排序,但其余列保持不变。我能做什么?

编辑

我尝试了答案,并意识到我没有足够详细地说明我的问题: 当我使用数据框时,我需要重新排列物种列的因子的顺序。 除了重新排序的数据框外,我还在寻找这个结果,以便在绘图时使用这个顺序:

head(d1$Species)
[1] virginica virginica virginica virginica virginica virginica
Levels: virginica setosa versicolor

然而,直到现在,订单仍然不是我想要的: `

【问题讨论】:

    标签: r sorting dataframe


    【解决方案1】:
     d1 <- d[order(factor(d$Species, levels=c("virginica","setosa","versicolor"))),]
     head(d1)
     #   Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
     #101          6.3         3.3          6.0         2.5 virginica
     #102          5.8         2.7          5.1         1.9 virginica
     #103          7.1         3.0          5.9         2.1 virginica
     #104          6.3         2.9          5.6         1.8 virginica
     #105          6.5         3.0          5.8         2.2 virginica
     #106          7.6         3.0          6.6         2.1 virginica
    

    更新

    要更改因子 Specieslevels,您必须:

       d$Species <- factor(d$Species, levels=c("virginica","setosa","versicolor"))
       d1 <- d[order(d$Species),]
      levels(d1$Species)
      #[1] "virginica"  "setosa"     "versicolor"
      head(d1,2)
      #    Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
      #101          6.3         3.3          6.0         2.5 virginica
      #102          5.8         2.7          5.1         1.9 virginica
    

    【讨论】:

    • 这几乎就是我想要的。我觉得我问的不够准确。尽管如此,因子的顺序还是不正确的。条形图仍将显示顺序“virginica”、“versicolor”、“setosa”,因为这似乎取决于d$Species 的因子顺序。你也知道这个问题的答案吗?
    • @aldorado。如果你检查levels(d1$Species)#[1] "setosa" "versicolor" "virginica",它仍然没有改变。你必须:d$Species &lt;- factor(d$Species, levels=c("virginica","setosa","versicolor")); d1 &lt;- d[order(d$Species),]; levels(d1$Species)#[1] "virginica" "setosa" "versicolor"; head(d1)
    • 它终于成功了(因为我先写了label而不是level,所以它没有成功)谢谢!
    【解决方案2】:
    require(plyr)
    d <- iris
    arrange(d, factor(d$Species, levels = c("virginica","setosa","versicolor")))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多