我正在将一些长格式的数据变成宽格式。当我将行转换为列时,它们的显示顺序为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(和堆栈)比较陌生,并尝试阅读文档无济于事。任何帮助,将不胜感激。谢谢!
答案 0 :(得分:1)
OP在注释中澄清说,它们实际上具有data.table而不是常规的data.frame。
提取列名并删除第一个列名:
names(DT)[-1]
从列名中提取数字(或者更简单地,删除“降水”一词):
gsub("precipitation", "", names(DT)[-1])
现在找到这些数字的排序顺序(将它们转换为数字值之后):
order(as.numeric(gsub("precipitation", "", names(DT)[-1])))
现在我们只需要在此顺序中添加第一列:
c(1, order(as.numeric(gsub("precipitation", "", names(DT)[-1]))) + 1)
并将订单传递给setcolorder
:
setcolorder(DT, c(1, order(as.numeric(gsub("precipitation", "", names(DT)[-1]))) + 1))