首页 > 解决方案 > dplyr:在 NSE 中按位置排列列

问题描述

我想dplyr::arrange根据特定列中的值对数据框的行进行排序。我想根据位置而不是列名来选择列,因为列名会因输入而异。我已尝试调整dplyr::select此处找到的建议(dplyr: select columns by position in NSE),但我的代码只返回原始数据框而没有任何更改。这是我的数据框和我用来对其进行排序的代码:

df <- structure(list(D7_ctrl_v_D6_ctrl_deg = structure(c(1L, 2L, 3L, 
1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 
2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L), .Label = c("down", "unchanged", 
"up"), class = "factor"), D7_OE_v_D7_ctrl_deg = structure(c(1L, 
1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 
3L, 1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L), .Label = c("down", "unchanged", 
"up"), class = "factor"), D7_OE_v_D6_ctrl_deg = structure(c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), .Label = c("down", "unchanged", 
"up"), class = "factor"), Freq = c(584L, 1841L, 375L, 636L, 331L, 
0L, 44L, 0L, 0L, 0L, 420L, 600L, 208L, 9164L, 280L, 391L, 410L, 
0L, 0L, 0L, 69L, 0L, 448L, 746L, 297L, 2362L, 715L)), class = "data.frame", row.names = c(NA, 
-27L))

## these all fail
df %>% dplyr::arrange(1)
df %>% dplyr::arrange(c(1))
df %>% dplyr::arrange(!!"1")
df %>% dplyr::arrange(!!c(1))

我猜这种差异与data-maskingused byarrangetidy-selectused by之间的差异有关select,但我不知道是否有办法按arrange. 任何建议,将不胜感激。谢谢。

标签: rdplyr

解决方案


使用 dplyr >v1.0,您可以使用across()按索引指定列。你可以做

df %>% dplyr::arrange(across(1))

推荐阅读