使用dplyr按照最后一列对数据框进行排序

6
library(dplyr)
df <- tibble(
  a = rnorm(10),
  b = rnorm(10),
  c = rnorm(10),
  d = rnorm(10)
)

df %>%
  arrange(colnames(df) %>% tail(1) %>% desc())

我正在循环遍历一个数据帧列表。每个数据帧中的列不同,每个数据帧的最后一列可能有不同的名称。

我需要按照每个数据帧的最后一列来排列它们。简单情况如上所示代码。

3个回答

11

使用arrange_atncol

df %>% arrange_at(ncol(.), desc)

由于 arrange_at 将来会被弃用,您也可以使用以下方法:

# option 1
df %>% arrange(desc(.[ncol(.)]))

# option 2
df %>% arrange(across(ncol(.), desc))

arrange_at在dplyr 0.7.0版本已被弃用。现在有什么可行的替代方案? - Wojciech Kulma
1
@wklm arrange_at 仍然是 [tag:dplyr] 的一部分,也仍然有效;但它已被标记为 superseded,这意味着它不再处于活跃开发状态,并且可能会被弃用;无论如何,我已经更新了答案。 - Jaap
1
df %>% arrange(desc(tail(colnames(.), 1))) 可以这样翻译:将数据框按最后一列降序排列。 - Wojciech Kulma

3
如果我们需要按照最后一列的名称进行排列,可以使用该名称字符串。
df %>% 
     arrange_at(vars(last(names(.))), desc)

或者指定索引

df %>%
    arrange_at(ncol(.), desc)

1

新的dplyr方式(我猜从1.0.0开始)是使用across(last_col())

library(dplyr)

df <- tibble(
    a = rnorm(10),
    b = rnorm(10),
    c = rnorm(10),
    d = rnorm(10)
)

df %>%
    arrange(across(last_col(), desc))

#> # A tibble: 10 x 4
#>          a       b       c       d
#>      <dbl>   <dbl>   <dbl>   <dbl>
#>  1 -0.283   0.443   1.30    0.910 
#>  2  0.797  -0.0819 -0.936   0.828 
#>  3  0.0717 -0.858  -0.355   0.671 
#>  4 -1.38   -1.08   -0.472   0.426 
#>  5  1.52    1.43   -0.0593  0.249 
#>  6  0.827  -1.28    1.86    0.0824
#>  7 -0.448   0.0558 -1.48   -0.143 
#>  8  0.377  -0.601   0.238  -0.918 
#>  9  0.770   1.93    1.23   -1.43  
#> 10  0.0532 -0.0934 -1.14   -2.08

> packageVersion("dplyr")
#> [1] ‘1.0.4’

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接