如何用数字重新排序R中的列名?

时间:2019-07-15 10:29:55

标签: r dataframe data-science

我正在将一些长格式的数据变成宽格式。当我将行转换为列时,它们的显示顺序为1、10、100,而不是1,2,3,依此类推。如何解决此问题?我有100行,所以我不想手动键入订单。

我知道这是列名称为字符串的问题,我尝试仅使用select(),但是,这删除了我的集群列。我还尝试了重命名列(data <- data[c("A", "B", "C")])的标准方法。

我也看了下面的线程,似乎无法解析它。 Reordering columns in a large dataframe Preserve order of columns when going from wide to long format R: Reorder columns from dcast output numerically instead of lexicographically

这是我的代码:

library(reshape2)
library(data.table)
library(tidyverse)
library(tidyr)
library(gtools)
library(stringr)

rf_83_88 <- read.csv('Google Drive File Stream/My Drive/Bang_RIA/bang_83_05_rainfall_avg/Bangladesh-precipitation-decadal-83-88.csv')


groupdata_1 <- dcast(setDT(rf_83_88), cluster ~
                     paste0("precipitation", rowid(cluster)), value.var = "precipitation")

这是它产生的df示例:

cluster        precipitation1  precipitation10 precipitation100
Akhai Bari _ 1   0               11.730278        11.12267
Akhai Bari _ 2   0               10.130148        12.53500

当我尝试:

test_select <- select(groupdata_1, num_range("precipitation", 0:nrow(groupdata_1))

,df变得有序,但是会丢弃群集。

我对R(和堆栈)比较陌生,并尝试阅读文档无济于事。任何帮助,将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:1)

OP在注释中澄清说,它们实际上具有data.table而不是常规的data.frame。

  1. 提取列名并删除第一个列名:

    names(DT)[-1]

  2. 从列名中提取数字(或者更简单地,删除“降水”一词):

    gsub("precipitation", "", names(DT)[-1])

  3. 现在找到这些数字的排序顺序(将它们转换为数字值之后):

    order(as.numeric(gsub("precipitation", "", names(DT)[-1])))

  4. 现在我们只需要在此顺序中添加第一列:

    c(1, order(as.numeric(gsub("precipitation", "", names(DT)[-1]))) + 1)

  5. 并将订单传递给setcolorder

    setcolorder(DT, c(1, order(as.numeric(gsub("precipitation", "", names(DT)[-1]))) + 1))