按列值对数据框排序 (r)

问题描述 投票:0回答:2

我是 R 新手,目前正在尝试了解 R 中的数据帧。 我想按列值对数据框进行排序,然后在排序后返回其顶部。

到目前为止,我似乎只拿回了一排。 我使用了“iris”数据框。

sort <- function(df, var.name, n){
  df1 <- df[rev(order(var.name)), ]
  sorted <- head(df1, n)
  return(sorted)
}

sort_head(df = iris, var.name = "Petal.Length", n = 10)
# My output
> sort_head(df = iris, var.name = "Petal.Length", n = 5)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa

我对数据帧的排序似乎将数据帧重写为仅包含一行 - 而我发现的所有指南(例如here)只是重写了数据帧以按列排序。我错过了什么?

r dataframe sorting
2个回答
5
投票

使用
arrange()
slice()
:

library(tidyverse)
iris %>%
  arrange(desc(Petal.Length)) %>%  # arrange in descending order
  slice(1:10)                      # return rows 1 through 10

返回:

   Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
1           7.7         2.6          6.9         2.3 virginica
2           7.7         3.8          6.7         2.2 virginica
3           7.7         2.8          6.7         2.0 virginica
4           7.6         3.0          6.6         2.1 virginica
5           7.9         3.8          6.4         2.0 virginica
6           7.3         2.9          6.3         1.8 virginica
7           7.2         3.6          6.1         2.5 virginica
8           7.4         2.8          6.1         1.9 virginica
9           7.7         3.0          6.1         2.3 virginica
10          6.3         3.3          6.0         2.5 virginica

如果您喜欢这种方法,我强烈建议您浏览一下r4ds第5章的示例,其中涵盖

{ dplyr }
{ tidyverse }
的一部分。当您在未来对 data.frame 转换感到困惑时,这必将节省您无数的时间。 =)


3
投票

虽然

df[rev(order(df$Sepal.Length)),]
将在函数之外工作 ->

在函数内部,我们必须从

$
切换到
[[
并将函数参数作为字符串传递:

因此函数内正确的术语是:

df[rev(order(df[[var.name]])), ]

sort_head <- function(df, var.name, n){
    df1 <- df[rev(order(df[[var.name]])), ]
    sorted <- head(df1, n)
    return(sorted)
}

sort_head(df = iris, var.name = "Petal.Length", n = 10)

输出:

sort_head(df = iris, var.name = "Petal.Length", n = 10)
    Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
119          7.7         2.6          6.9         2.3 virginica
123          7.7         2.8          6.7         2.0 virginica
118          7.7         3.8          6.7         2.2 virginica
106          7.6         3.0          6.6         2.1 virginica
132          7.9         3.8          6.4         2.0 virginica
108          7.3         2.9          6.3         1.8 virginica
136          7.7         3.0          6.1         2.3 virginica
131          7.4         2.8          6.1         1.9 virginica
110          7.2         3.6          6.1         2.5 virginica
126          7.2         3.2          6.0         1.8 virginica
© www.soinside.com 2019 - 2024. All rights reserved.