按类排列数据框列:数字前字符

Tou*_*Mou 7 sorting r

下午好 ,

假设我们有以下数据集:

dput(head(cylinder))
structure(list(X19910108 = c("19910109", "19910104", "19910104", 
"19910111", "19910104", "19910111"), X126 = c("X266", "B7", "T133", 
"J34", "T218", "X249"), TVGUIDE = c("TVGUIDE", "MODMAT", "MASSEY", 
"KMART", "MASSEY", "ROSES"), X25503 = c(25503L, 47201L, 39039L, 
37351L, 38039L, 35751L), YES = c("YES", "YES", "YES", "NO", "YES", 
"NO"), KEY = c("KEY", "KEY", "KEY", "KEY", "KEY", "KEY"), YES.1 = c("YES", 
"YES", "YES", "YES", "YES", "YES"), BENTON = c("BENTON", "BENTON", 
"BENTON", "BENTON", "BENTON", "BENTON"), GALLATIN = c("GALLATIN", 
"GALLATIN", "GALLATIN", "GALLATIN", "GALLATIN", "GALLATIN"), 
    UNCOATED = c("UNCOATED", "UNCOATED", "UNCOATED", "UNCOATED", 
    "UNCOATED", "COATED"), UNCOATED.1 = c("UNCOATED", "COATED", 
    "UNCOATED", "COATED", "UNCOATED", "COATED"), NO = c("NO", 
    "NO", "NO", "NO", "NO", "NO"), LINE = c("LINE", "LINE", "LINE", 
    "LINE", "LINE", "LINE"), YES.2 = c("YES", "YES", "YES", "YES", 
    "YES", "YES"), Motter94 = c("Motter94", "WoodHoe70", "WoodHoe70", 
    "WoodHoe70", "WoodHoe70", "Motter94"), X821 = c(821L, 815L, 
    816L, 816L, 816L, 827L), X2 = c(2, 9, 9, 2, 2, 2), TABLOID = c("TABLOID", 
    "CATALOG", "CATALOG", "TABLOID", "CATALOG", "TABLOID"), NorthUS = c("NorthUS", 
    "NorthUS", "NorthUS", NA, "NorthUS", "CANADIAN"), X1911 = c(NA, 
    NA, 1910L, 1910L, 1910L, 1911L), X55 = c(55, 62, 52, 50, 
    50, 50), X46 = c(46L, 40L, 40L, 46L, 40L, 46L), X0.2 = c("0.3", 
    "0.433", "0.3", "0.3", "0.267", "0.3"), X17 = c(15, 16, 16, 
    17, 16.8, 16.5), X78 = c(80L, 80L, 75L, 80L, 76L, 75L), X0.75 = c(0.75, 
    NA, 0.3125, 0.75, 0.4375, 0.75), X20 = c(20L, 30L, 30L, 30L, 
    28L, 30L), X13.1 = c(6.6, 6.5, 5.6, 0, 8.6, 0), X1700 = c(1900L, 
    1850L, 1467L, 2100L, 1467L, 2600L), X50.5 = c(54.9, 53.8, 
    55.6, 57.5, 53.8, 62.5), X36.4 = c(38.5, 39.8, 38.8, 42.5, 
    37.6, 37.5), X0 = c(0, 0, 0, 5, 5, 6), X0.1 = c(0, 0, 0, 
    0, 0, 0), X2.5 = c(2.5, 2.8, 2.5, 2.3, 2.5, 2.5), X1 = c(0.7, 
    0.9, 1.3, 0.6, 0.8, 0.6), X34 = c(34, 40, 40, 35, 40, 30), 
    X40 = c(40L, 40L, 40L, 40L, 40L, 40L), X105 = c(105, 103.87, 
    108.06, 106.67, 103.87, 106.67), X100 = c(100L, 100L, 100L, 
    100L, 100L, 100L), band = c("noband", "noband", "noband", 
    "noband", "noband", "noband")), row.names = c(NA, 6L), class = "data.frame")
Run Code Online (Sandbox Code Playgroud)

列类型是:

sapply(cylinder,class)

  X19910108        X126     TVGUIDE      X25503         YES         KEY       YES.1      BENTON    GALLATIN 
"character" "character" "character"   "integer" "character" "character" "character" "character" "character" 
   UNCOATED  UNCOATED.1          NO        LINE       YES.2    Motter94        X821          X2     TABLOID 
"character" "character" "character" "character" "character" "character"   "integer"   "numeric" "character" 
    NorthUS       X1911         X55         X46        X0.2         X17         X78       X0.75         X20 
"character"   "integer"   "numeric"   "integer" "character"   "numeric"   "integer"   "numeric"   "integer" 
      X13.1       X1700       X50.5       X36.4          X0        X0.1        X2.5          X1         X34 
  "numeric"   "integer"   "numeric"   "numeric"   "numeric"   "numeric"   "numeric"   "numeric"   "numeric" 
        X40        X105        X100        band 
  "integer"   "numeric"   "integer" "character" 
Run Code Online (Sandbox Code Playgroud)

我想对数据集列重新排序,使"numeric"列(数字和整数)首先位于左侧。该"character"列必须是在正确的!

谢谢你的帮助 !

akr*_*run 5

我们还可以使用where带有|逻辑运算符的 single ,该运算符将两个表达式与 lambda 调用组合在一起

library(dplyr)
df %>% 
    select(where(~ is.character(.)|is.numeric(.)))
Run Code Online (Sandbox Code Playgroud)


Mar*_*ila 3

沿着这些思路的东西会起作用

library(dplyr)
df %>% select(where(is.numeric), where(is.character))
Run Code Online (Sandbox Code Playgroud)