【问题标题】:reorder columns dynamically in a data frame in R在R中的数据框中动态重新排序列
【发布时间】:2018-12-04 21:26:55
【问题描述】:
我正在尝试对 R 中的列重新排序。情况如下:
我现在有 9 列:A-NP F-WR K-WR H-ER Q-ER B-NP C-NP Z-WR X-ER
规则是 NP > WR > ER。所以名称中带有 NP 的列应该是第一列。在同一组的列中,按字母顺序排列。
所以想要的输出是:
A-NP B-NP C-NP F-WR K-WR Z-WR H-ER Q-ER X-ER
这些列采用这种格式(某些东西-NP/WR/ER),但每次都不一样,所以我想创建一些可以动态排序这些列的东西。
有什么想法吗?
谢谢,
【问题讨论】:
标签:
r
dataframe
data-manipulation
【解决方案1】:
# create an example data frame
df <- data.frame(matrix(ncol = 9, nrow = 0))
names(df) <- c("A-NP", "F-WR", "K-WR", "H-ER", "Q-ER", "B-NP", "C-NP", "Z-WR", "X-ER")
library(dplyr)
df %>%
# sort in alphabetical order
select(sort(names(.))) %>%
# sort based on the rule
select(contains("NP"), contains("WR"), contains("ER"))
# [1] A-NP B-NP C-NP F-WR K-WR Z-WR H-ER Q-ER X-ER
# <0 rows> (or 0-length row.names)
【解决方案2】:
这是使用 ?grep() 的基本 R 解决方案 -
df <- data.frame(matrix(ncol = 9, nrow = 0))
names(df) <- c("F-WR", "K-WR", "H-ER", "Q-ER", "B-NP", "C-NP", "Z-WR", "X-ER", "A-NP")
df[, c(sort(grep("NP", names(df), value = T)),
sort(grep("WR", names(df), value = T)),
sort(grep("ER", names(df), value = T))
)
]
[1] A-NP B-NP C-NP F-WR K-WR Z-WR H-ER Q-ER X-ER
<0 rows> (or 0-length row.names)