首页 > 解决方案 > 根据名称对列进行排序 R

问题描述

我需要根据列名对 R 中的以下 data.frame 进行排序:

L1 L10 L11 L12           L13       L14 L15        L16          L17 L18 L19 L2 L20 L21        L22 L23 L24         L25
1  1.00000000   0   0   0  0.000000e+00 0.0000000   0 0.00000000 0.000000e+00   0   0  0   0   0 0.00000000   0   0 0.000000000

有序列必须如下所示:

L1 L2 L10 L11 L12 L13 L14 L15 L16 L17 L18 L19 L20 L21 L22 L23 L24 L25

标签: rdataframe

解决方案


你可以这样做sort(names(df)),但问题是 L2 在 L10 之后(字符串的字典排序)。

我们可以做的一件事是在长度为 2 的字符串前面添加一个空格(左填充),以确保它们在排序时排在前面。

df[order(sprintf("%*s", 3, names(df)))]


  L1 L2 L10 L11 L12 L13 L14 L15 L16 L17 L18 L19 L20 L21 L22 L23 L24 L25
1  1  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0

另一种stringr选择:

df[order(stringr::str_pad(names(df), 3, side = "left", pad = " "))]

PS。

如果您有更长的变量名,则 3 应替换为max(nchar(names(df)).


推荐阅读