【问题标题】:R Sort/order specific named columns containing numbers and letters (data.frame)R对包含数字和字母的特定命名列进行排序/排序(data.frame)
【发布时间】:2018-06-24 15:09:04
【问题描述】:

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

我的真实数据框中的列数更多,动态解决方案将不胜感激。

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

【问题讨论】:

    标签: r


    【解决方案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
    

    这假定所有列都有前缀“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
    

    【讨论】:

    • 谢谢@tyluRp 的工作很完美,你知道基本的 R 解决方案吗?
    • 我已经更新了我的答案。它给出了一条警告消息,但仍然正确地对列进行排序。
    • 完美!非常感谢朋友! @tyluRp
    【解决方案2】:
    db[,order(as.numeric(gsub("X","",names(db))),na.last=F)]
    

    【讨论】:

      【解决方案3】:

      更新: 我已经扩展了示例数据以确保字母数字排序有效

      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
      

      【讨论】:

      • 如果有一个名为 X10 的列,这将不起作用。例如,db[sort(colnames(db))] 与 colnames X2X10 将返回 X10X2
      • 感谢@tyluRp 指出异常,我已经更新了解决方案
      • 谢谢@ImranAli!,我没有提到我更喜欢基本 R 解决方案,但我现在将使用该软件包,如果您知道基本 R 解决方案,请告诉我!谢谢
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-24
      • 2021-02-22
      • 2016-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多