【问题标题】:Reordering column names重新排序列名
【发布时间】:2017-04-22 05:25:03
【问题描述】:

我在两种情况下都有类似的问题。

场景 1:具有相同列名的数据框和两个组,没有特定顺序。 全部|全部|AML|全部|AML|AML|AML|全部

场景 2:带有数字后缀的数据框列名。 ALL, ALL.1, ALL.2, AML.1, AML.2, ...这也有两位数。如果我按升序排序,它将变为 ALL.1、ALL.10、ALL.11

我希望首先对所有 ALL 进行分组,然后是 AML。如何在这两种情况下实现这一点?

【问题讨论】:

  • 不唯一的名称在 data.frame 中几乎是无用的。可能最好在做任何其他事情之前致电make.unique。总而言之,也许是library(purrr); names(df) <- make.unique(names(df)); ord <- names(df) %>% strsplit('\\.') %>% map_df(~list(V1 = .x[1], V2 = as.integer(.x[2]))) %>% invoke(order, ., na.last = FALSE); df <- df[, ord]
  • 或者library(tidyverse); ord <- data_frame(name = names(df)) %>% separate(name, c('var', 'suf'), convert = TRUE, fill = 'right') %>% invoke(order, .)

标签: r


【解决方案1】:

解决这个问题的一种方法,

y <- c('ALL', 'ALL.1', 'ALL.2', 'AML.1', 'AML.2', 'ALL.10')

y[order(gsub('\\.\\d+', '', y))]
#[1] "ALL"    "ALL.1"  "ALL.2"  "ALL.10" "AML.1"  "AML.2" 

#or to use it in a data frame,
df[,order(gsub('\\.\\d+', '', names(df))))]

此外,您可以使用gtools 包中的mixedorder,但您必须替换后缀中的.,这样它就不会将其视为十进制(意思是 .10 2) ,即

library(gtools)

#with the . in suffix
mixedsort(y)
#[1] "ALL.1"  "ALL.10" "ALL.2"  "ALL"    "AML.1"  "AML.2" 

#without the . in suffix
mixedsort(gsub('\\.', '_', y))
#[1] "ALL"    "ALL_1"  "ALL_2"  "ALL_10" "AML_1"  "AML_2" 

#or use it on the data frame
df[,mixedorder(gsub('\\.', '_', names (df)]

至于您的第一个案例,我同意@alistaire 的观点,即名称必须是唯一的。使用make.unique并按照上面的方法进行

【讨论】:

  • 这取决于下标升序。如果是在make.unique 之后,那是真的。
  • @alistaire 我假设 colnames 中的数字后缀是通过某些操作自动放在那里的,所以它们总是按递增顺序排列
  • 非常感谢大家! @Sotos,你是对的,我试图使重复的列名唯一,这就是我到达场景 2 的方式,但不太清楚如何重新排序。
  • 感谢您的意见@alistaire,未来要记住的事情。
猜你喜欢
  • 1970-01-01
  • 2021-12-26
  • 2021-09-30
  • 1970-01-01
  • 1970-01-01
  • 2019-09-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多