【问题标题】:R order list based on multiple characters from each item基于每个项目的多个字符的 R 订单列表
【发布时间】:2022-07-12 04:24:56
【问题描述】:

我想根据列表中每个项目的第一个字符对列表进行排序。该列表包含 chr 数据,尽管其中一些字符是数字。我一直在尝试使用substr()order 的组合,但无济于事。

例如:

mylist <- c('0_times','3-10_times','11_20_times','1-2_times','more_than_20_times')
mylist[order(substr(mylist,1,2))]

但是,这会导致 11-20_times 被放置在 3-10_times 之前:

[1] "0_times"            "1-2_times"          "11-20_times"        "3-10_times"         "more_than_20_times"

更新
提供有关用例的更多详细信息。
我的数据类似于以下:

mydf <- data.frame(X1=c("0_times","3-10_times", "11-20_times", "1-2_times","3-10_times",
                        "0_times","3-10_times", "11-20_times", "1-2_times","3-10_times" ),
                   X2=c('a','b','c','d','e','a','b','c','d','e'))

mydf2 <- data.frame(names = colnames(mydf))

mydf2$vals <- lapply(mydf, unique)

我想要排序的是mydf2$vals 中的值。虽然@AllanCameron 的解决方案在单个列表上完美运行,但我想将其应用于mydf2$vals 中包含的每个列表,但无法弄清楚如何。

我的经验不足在这里很明显,但我整天都在为此苦苦挣扎。

【问题讨论】:

    标签: r


    【解决方案1】:

    这需要一些字符串解析和转换为数字:

    o <- sapply(strsplit(mylist, '\\D+'), function(x) min(as.numeric(x[nzchar(x)])))
    mylist[order(o)]
    #> [1] "0_times"            "1-2_times"          "3-10_times"        
    #> [4] "11_20_times"        "more_than_20_times"
    

    【讨论】:

    • 这段代码可以处理多个不以数字开头的字符串?
    • @RobertoT 是的,如本例所示。
    • @AllanCameron 这太好了,谢谢!您的解决方案完美地满足了我的目的,并且可以推广到我的所有数据。真的很感激。
    • @AllanCameron 另一个问题,如果可以的话。如果我想将此应用于数据框的列,其中每个值都是一个列表,可以这样做吗?我无法弄清楚这一点,因为 strsplit 调用中引用了特定列表
    • @r0bt strsplit 将字符串拆分为非数字字符,只留下数字字符串(和一些空字符串)。 strsplit 的结果是字符串向量列表(原始向量中的每个条目对应一个向量)。这被传递给 sapply,其中将删除空字符串,将结果从字符转换为数字,并选择最小整数。 sapply 自动将它们放入单个数字向量中,这为我们提供了用于对原始向量进行排序的对象 o
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-19
    • 2016-10-27
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    相关资源
    最近更新 更多