基于r中因子水平索引的排序数据帧

问题描述 投票:0回答:1

我有一个如下所示的数据框:

df <- data.frame(Name = c("BB", "AA", "AA", "BB", "DD", "AA", "DD", "DD", "CC"), 
             string = c("a11", "a120", "a120", "a8", "a45", "a11", "a140", "a8", "a45") ,
             value = rnorm(9, mean = 0, 1))

Name  string   value

 BB    a11  0.5912728
 AA   a120  0.5885065
 AA   a120 -0.5287264
 BB     a8  0.6932831
 DD    a45 -0.2892612
 AA    a11  1.0441365
 DD   a140 -0.5091612
 DD     a8 -0.3358695
 CC    a45  0.5598616

我想对df重新排序,以便根据数字部分pf字符串列对其进行排序。

我正在尝试以下命令:

string <- unique(as.character(df$string))
sorted.ind <- sort(as.numeric(gsub('a', '', string)), index.return = T)$ix
df$string <- factor(df$string, levels = string[sorted.ind])  

但是它也不对表重新排序。

这是我想要的输出:

Name  string  value

BB     a8  0.6932831
DD     a8 -0.3358695
BB    a11  0.5912728
AA    a11  1.0441365
DD    a45 -0.2892612
CC    a45  0.5598616
AA   a120  0.5885065
AA   a120 -0.5287264
DD   a140 -0.5091612

有人知道我该如何修正我的代码?

谢谢

r dataframe dplyr tidyr
1个回答
0
投票

您可以使用stringr::str_order()(或stringi::stri_order())将numeric参数设置为TRUE

library(stringr)

df[str_order(df$string, numeric = TRUE), ]

  Name string       value
4   BB     a8  1.74351093
8   DD     a8  0.41802240
1   BB    a11  0.61559079
6   AA    a11  0.63900177
5   DD    a45 -1.87046411
9   CC    a45 -0.44398027
2   AA   a120 -0.84459958
3   AA   a120  0.01800482
7   DD   a140 -0.88140002
© www.soinside.com 2019 - 2024. All rights reserved.