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

时间:2018-01-15 23:48:13

标签: r

我想知道如何使用基数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

我的实际数据框中的列数更多,我们将欣赏动态解决方案。

感谢您的关注,并抱歉英语不好!

3 个答案:

答案 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