我尝试使用arrange()按name_underline_number对列进行排序。它没有起作用。
在dplyr()中做这件事的最好方法是什么?
df <- structure(list(metric = c("rollmean_11", "rollmean_13", "rollmean_15",
"rollmean_17", "rollmean_19", "rollmean_3", "rollmean_5", "rollmean_7",
"rollmean_9"), MSE = c(1.92523924349549, 2.39347151053903, 2.89870886591451,
3.4854131592187, 4.26101662911107, 0.651614338676069, 1.06260257822741,
1.26237156422673, 1.55433498103862)), row.names = c(NA, -9L), class = c("tbl_df",
"tbl", "data.frame"))
metric MSE
<chr> <dbl>
1 rollmean_11 1.93
2 rollmean_13 2.39
3 rollmean_15 2.90
4 rollmean_17 3.49
5 rollmean_19 4.26
6 rollmean_3 0.652
7 rollmean_5 1.06
8 rollmean_7 1.26
9 rollmean_9 1.55 预期输出
metric MSE
<chr> <dbl>
1 rollmean_3 0.652
2 rollmean_5 1.06
3 rollmean_7 1.26
4 rollmean_9 1.55
5 rollmean_11 1.93
6 rollmean_13 2.39
7 rollmean_15 2.90
8 rollmean_17 3.49
9 rollmean_19 4.26 发布于 2021-06-15 23:15:36
它不起作用,因为作为一个字符串,11在2之前。
我们可以通过填充数字来系统地解决这个问题:
library(dplyr)
library(stringr)
df %>%
mutate(metric = str_replace(metric,
"\\d+",
\(i) str_pad(i, 2, pad = "0"))) %>%
arrange(metric)返回:
# A tibble: 9 x 2
metric MSE
<chr> <dbl>
1 rollmean_03 0.652
2 rollmean_05 1.06
3 rollmean_07 1.26
4 rollmean_09 1.55
5 rollmean_11 1.93
6 rollmean_13 2.39
7 rollmean_15 2.90
8 rollmean_17 3.49
9 rollmean_19 4.26发布于 2021-06-15 23:11:00
这样做是可行的:
library(dplyr)
library(stringr)
df %>% arrange(as.numeric(str_extract(metric, '\\d+$')))
# A tibble: 9 x 2
metric MSE
<chr> <dbl>
1 rollmean_3 0.652
2 rollmean_5 1.06
3 rollmean_7 1.26
4 rollmean_9 1.55
5 rollmean_11 1.93
6 rollmean_13 2.39
7 rollmean_15 2.90
8 rollmean_17 3.49
9 rollmean_19 4.26 发布于 2021-06-15 23:41:18
我们可以使用readr中的parse_number来提取数字部分,并在arrange中使用它
library(dplyr)
df %>%
arrange(readr::parse_number(metric))-output
# A tibble: 9 x 2
metric MSE
<chr> <dbl>
1 rollmean_3 0.652
2 rollmean_5 1.06
3 rollmean_7 1.26
4 rollmean_9 1.55
5 rollmean_11 1.93
6 rollmean_13 2.39
7 rollmean_15 2.90
8 rollmean_17 3.49
9 rollmean_19 4.26 https://stackoverflow.com/questions/67988864
复制相似问题