簡體   English   中英

R排序/排序包含數字和字母的特定命名列(data.frame)

[英]R Sort/order specific named columns containing numbers and letters (data.frame)

我想知道如何使用基數R對包含字母和數字的R中的命名列進行排序或排序

這是我的示例數據:

Names <- c("Name1","Name2")
X2 <- c("10","1")
X1 <- c("7","5")
X10 <- c("8","3")
db <- data.frame(Names, X2, X1, X10)

輸出/視圖(data.frame):

Names X2 X1 X10
Name1 10  7  5
Name2  1  5  7

假設我要對開頭包含“ X”字符但使用其數字“值”的列進行排序或排序? 期待這個輸出:

Names X1 X2 X10
Name1  7 10  5
Name2  5  1  7

這是我目前的解決方案,希望對所有人有幫助:)

db_names <- colnames(db[,2:ncol(db)])
db_names <- db_names[order(nchar(db_names), db_names)]
cbind(Names = db[,1],db[,db_names])

輸出:

Names X1 X2 X10
Name1  7 10  5
Name2  5  1  7

我的實際數據幀中的列數更多,我們將贊賞動態解決方案。

感謝您的關注,對不起,英語不好!

dplyr

library(dplyr)

# With the pipe
db %>% 
  select(Names, num_range("X", range = 1:10))

# Without the pipe
select(db, Names, num_range("X", range = 1:10))

兩者都返回:

  Names X1 X2 X10
1 Name1  7 10   8
2 Name2  5  1   3

假定所有列都具有前綴“ X”。 相應地調整范圍。


一種基本的R解決方案可能是:

db[order(as.numeric(substring(colnames(db), 2)), na.last = FALSE)]

返回:

  Names X1 X2 X10
1 Name1  7 10   8
2 Name2  5  1   3

這與其他答案類似,但是使用substring而不是gsub 這還會產生以下警告消息:

 Warning message: In order(as.numeric(substring(colnames(db), 2)), na.last = FALSE) : NAs introduced by coercion 

這是因為我們無法將“ Names轉換為數值:

as.numeric(substring(colnames(db), 2))
 Warning message: NAs introduced by coercion 
[1] NA  2  1 10
db[,order(as.numeric(gsub("X","",names(db))),na.last=F)]

更新:我已經擴展了示例數據,以確保字母數字排序有效

Names <- c("Name1","Name2")
X2 <- c("10","1")
X1 <- c("7","5")
X10 <- c("8","5")
X11 <- c("6","5")

使用mixedorder包中的gtools

db <- db[mixedorder(colnames(db))]

輸出:

Names X1 X2 X10 X11
Name1  7 10   8   6
Name2  5  1   5   5

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM