我想知道如何使用基数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
我想说我想对包含&#34; X&#34;的列进行排序或排序。开头的字符,但使用其数字&#34;值&#34;?期待这个输出:
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
我的实际数据框中的列数更多,我们将欣赏动态解决方案。
感谢您的关注,并抱歉英语不好!
答案 0 :(得分:1)
使用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
这假设所有列都有前缀&#34; X&#34;。相应地调整范围。
一个基本的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
答案 1 :(得分:1)
db[,order(as.numeric(gsub("X","",names(db))),na.last=F)]
答案 2 :(得分:0)
<强>更新强> 我扩展了示例数据以确保字母数字排序有效
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