df 是一個測驗資料框,我需要按升序對最后三列進行排序(無需對順序進行硬編碼)。
df <- data.frame(X = c(1, 2, 3, 4, 5),
Z = c(1, 2, 3, 4, 5),
Y = c(1, 2, 3, 4, 5),
A = c(1, 2, 3, 4, 5),
C = c(1, 2, 3, 4, 5),
B = c(1, 2, 3, 4, 5))
期望的輸出:
> df
X Z Y A B C
1 1 1 1 1 1 1
2 2 2 2 2 2 2
3 3 3 3 3 3 3
4 4 4 4 4 4 4
5 5 5 5 5 5 5
我知道該order()功能,但我似乎無法找到實作它以獲得所需輸出的正確方法。
uj5u.com熱心網友回復:
更新:
基礎 R:
cbind(df[1:3],df[4:6][,order(colnames(df[4:6]))])
第一個回答:
我們可以使用relocate來自dplyr:
https://dplyr.tidyverse.org/reference/relocate.html
它被配置為排列列:
這里我們按索引重定位。我們取 last (index = 6) 并將其放在之前(位置 5,即 C)
library(dplyr)
df %>%
relocate(6, .before = 5)
替代:
library(dplyr)
df %>%
select(order(colnames(df))) %>%
relocate(4:6, .before = 1)
X Z Y A B C
1 1 1 1 1 1 1
2 2 2 2 2 2 2
3 3 3 3 3 3 3
4 4 4 4 4 4 4
5 5 5 5 5 5 5
uj5u.com熱心網友回復:
在 base 中R,對第一列進行選擇,然后對最后 3 個名稱進行排序:
df[, c(names(df)[1:(ncol(df)-3)], sort(names(df)[ncol(df)-2:0]))]
uj5u.com熱心網友回復:
我們想根據列名對列重新排序,所以如果我們使用names(df)作為 order 的引數,我們可以按如下方式重新排序資料框。
復雜的因素是order()回傳一個數字向量,所以如果我們只想重新排序列名的子集,我們需要一種方法來保留前三列的原始排序順序。
我們通過創建前 3 個列名稱的向量來實作這一點,使用回傳值而不是向量中的位置的函式對剩余的列名稱進行排序,然后將其與[提取運算子的形式一起使用。
df <- data.frame(X = c(1, 2, 3, 4, 5),
Z = c(1, 2, 3, 4, 5),
Y = c(1, 2, 3, 4, 5),
A = c(1, 2, 3, 4, 5),
C = c(1, 2, 3, 4, 5),
B = c(1, 2, 3, 4, 5))
df[,c(names(df[1:3]),sort(names(df[4:6])))]
...和輸出:
> df[,c(names(df[1:3]),sort(names(df[4:6])))]
X Z Y A B C
1 1 1 1 1 1 1
2 2 2 2 2 2 2
3 3 3 3 3 3 3
4 4 4 4 4 4 4
5 5 5 5 5 5 5
uj5u.com熱心網友回復:
to_order <- seq(ncol(df)) > ncol(df) - 3
df[order(to_order*order(names(df)))]
#> X Z Y A B C
#> 1 1 1 1 1 1 1
#> 2 2 2 2 2 2 2
#> 3 3 3 3 3 3 3
#> 4 4 4 4 4 4 4
#> 5 5 5 5 5 5 5
由reprex 包(v2.0.1)于 2021 年 12 月 24 日創建
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/392723.html
