[英]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.