【问题标题】:Sort a list using partial match with vector (r)使用与向量 (r) 的部分匹配对列表进行排序
【发布时间】:2019-09-19 14:31:46
【问题描述】:

我正在尝试根据与字符串向量的部分匹配来重新排序列表中的元素。因此,如果我有以下列表:

    myList = list(BvsAadditionalinfo, AvsAothertext,
 BvsBothertext, AvsBothertext, AvsBadditionalinfo,
 BvsAothertext, BvsBadditionalinfo, AvsAadditionalinfo)

还有一个像这样的向量:

vsList = c("AvsA", "AvsB", "BvsA", "BvsB")

我可以对我的列表进行排序,最终得到:

    myList = list(AvsAothertext, AvsAadditionalinfo,
 AvsBothertext, AvsBadditionalinfo, BvsAothertext,
 BvsAadditionalinfo, BvsBothertext, BvsBadditionalinfo)

我尝试过使用类似于order 的东西:

TempFileList <- [order(match(myList, vsList))]

但它似乎不起作用,大概是因为匹配不是 100%。如何告诉它接受部分匹配?

我的 vsList 也没有任何附件,所以我可以很容易地使用这样的东西:

abbreviations = c("A", "B")

如果可以的话。

【问题讨论】:

  • vsList 的每一项是否总是 4 个字符?如果是这样,您可以执行 order(match(lapply(myList,substr,1,4), vsList)) 之类的操作,但显然如果它可能会更改长度,那将无法正常工作

标签: r list sorting vector


【解决方案1】:
myList = list(BvsAadditionalinfo = 0, AvsAothertext = 0,
              BvsBothertext = 0, AvsBothertext = 0,
              AvsBadditionalinfo = 0, BvsAothertext = 0,
              BvsBadditionalinfo = 0, AvsAadditionalinfo = 0)

myList[order(-rowSums(sapply(seq_along(vsList), function(i)
    i * grepl(vsList[i], names(myList)))), names(myList), decreasing = TRUE)]
#$`AvsAothertext`
#[1] 0

#$AvsAadditionalinfo
#[1] 0

#$AvsBothertext
#[1] 0

#$AvsBadditionalinfo
#[1] 0

#$BvsAothertext
#[1] 0

#$BvsAadditionalinfo
#[1] 0

#$BvsBothertext
#[1] 0

#$BvsBadditionalinfo
#[1] 0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-05
    • 2016-01-31
    • 1970-01-01
    • 1970-01-01
    • 2011-05-16
    • 2023-03-19
    • 1970-01-01
    相关资源
    最近更新 更多