【问题标题】:How can I identify and count unique pairs at every level in a list of lists in R?如何在 R 中的列表列表中识别和计算每个级别的唯一对?
【发布时间】:2020-03-19 13:44:51
【问题描述】:

我有一个如下所示的列表:

> class(cladelist)
[1] "list"

cladelist <- list( `46` = scan(text=' "KbFk2"  "PeHa3"  "PeHa51" "EeBi27" "EeBi17" "PeHa23" "PeHa44" "EeBi4"  "EeBi26" "PeHa8"  "PeHa26" "EeBi24" "EeBi3" 
 "EeBi20" "KbFk5"  "PeHa15" "PeHa43" "PeHa11" "PeHa12" "PeHa49" "PeHa67" "PeHa17" "PeHa59" "KbFk4"  "PeHa10" "PeHa55"
 "PeHa73" "EeBi23" "PeHa78" "PeHa81" "EeBi11" "PeHa45" "EeBi6"  "EeBi34" "PeHa25" "PeHa52" "PeHa62" "PeHa31" "PeHa65"
 "PeHa47" "PeHa50" "PeHa34" "PeHa54" "PeHa22" "PeHa30"', what=""),

`47`= scan(text='
 "KbFk2"  "EeBi27" "EeBi17" "EeBi4"  "EeBi26" "EeBi3"  "EeBi20" "KbFk5"  "KbFk4"  "EeBi6"  "EeBi34"', what=""),

`48`= scan(text=' "PeHa3"  "PeHa51" "PeHa23" "PeHa44" "PeHa8"  "PeHa26" "EeBi24" "PeHa15" "PeHa43" "PeHa11" "PeHa12" "PeHa49" "PeHa67"
 "PeHa17" "PeHa59" "PeHa10" "PeHa55" "PeHa73" "EeBi23" "PeHa78" "PeHa81" "EeBi11" "PeHa45" "PeHa25" "PeHa52" "PeHa62"
 "PeHa31" "PeHa65" "PeHa47" "PeHa50" "PeHa34" "PeHa54" "PeHa22" "PeHa30"', what=""),

`49`= scan(text=' "PeHa51" "PeHa23" "PeHa44" "PeHa8"  "PeHa26" "EeBi24" "PeHa15" "PeHa43" "PeHa11" "PeHa12" "PeHa49" "PeHa67" "PeHa17"
 "PeHa59" "PeHa10" "PeHa55" "PeHa73" "EeBi23" "PeHa78" "PeHa81" "EeBi11" "PeHa45" "PeHa25" "PeHa52" "PeHa62" "PeHa31"
 "PeHa65" "PeHa47" "PeHa50" "PeHa34" "PeHa54" "PeHa22" "PeHa30"', what=""),

`50`= scan(text=' "EeBi27" "EeBi17" "EeBi4"  "EeBi26" "EeBi3"  "EeBi20" "KbFk5"  "KbFk4"  "EeBi6"  "EeBi34"', what="") )

这些子列表中的每一个(即“46”、“47”等)都代表了我使用以下方法提取的树状图中的一个进化枝:

> cladelist <- clade.members.list(VB.phy, tips = FALSE, tip.labels = TRUE, include.nodes=FALSE)

我试图找到在每个子列表中找到的每个唯一对,并计算它在所有子列表(进化枝)之间出现的时间总和。

理想的输出将是一个如下所示的数据帧,其中计数是在所有子列表(进化枝)之间找到该对的次数:

Pair     Count
Peha1/PeHa2 2
Peha1/PeHa3 4
PeHa1/PeHa4 7
PeHa1/PeHa5 3

我在寻找什么样的公式?

问题的背景(只是为了兴趣,没有添加那么多问题):

我的想法是我有一个包含 121 个这些元素(Peha1、KbFk3 等)的数据集。它们是我正在使用 3D 几何形态测量学评估的文物(我是一名考古学家)。问题是这些工件并不完整。它们被损坏或降级,因此提供的数据量不一致。因此,我不得不减少每个工件使用的数据,以获得合理但仍然不一致的样本量。通过选择某些变量进行评估,我可以获得有用的信息,但这需要我测试变量的每个组合。我的一项分析给了我使用分裂层次聚类的树状图。

计算每个进化枝之间发现的每一对的频率应该是每对工件的关系强度。然后我将这个计数除以进化枝的总数,以便为下一步标准化。一旦我为 X 个树状图完成此操作,我将为每对组合所有这些值,并将它们除以表示该对是否出现在树状图中的数字(如果它出现在 2 个树状图中,我除以 2 ),因为每一对都不会出现在我的每个测试中,我必须对其进行标准化,以便在我的测试中更频繁出现的更完整的工件不会有太多的权重。这应该允许我评估哪些对具有最强的关系。

【问题讨论】:

  • 我无法确定预期的“配对”类型。 (并且我修改了您的示例,因此可以剪切粘贴以提供有效的 R 对象。)
  • 这有点跑题了,但是成对计数和相关性在文本分析(TF-IDF 和其他方法)以及市场篮关联(包括在@ 987654326@包)。您也许可以在其他一些(不太有趣的)领域提升一些代码。

标签: r list split count


【解决方案1】:

这属于一组关联类型的问题,我发现widyr 包非常有用,因为它可以进行成对计数和相关性。 (stack() 函数只是转换成一个数据帧,其余的都可以流动)。

我无法检查您的示例输出,但对于像“PeHa23/PeHa51”这样的示例,输出显示它们在 3 个不同的进化枝中配对在一起。

这目前不包括零计数以耗尽所有可能的对,但也可以显示(使用complete())。

更新:使 dplyr 等包的引用更加清晰,并进行了过滤,以便计数是非定向的(item1-item2 与 item2-item1 相同,可以过滤)。

library(tidyverse)
library(widyr)

df <- stack(cladelist) %>%
  dplyr::rename(clade = "ind", artifact = "values")
df %>%
  widyr::pairwise_count(feature = clade, item = artifact) %>%
  filter(item1 > item2) %>%
  mutate(Pair = paste(item1, item2, sep = "/")) %>%
  dplyr::select(Pair, Count = n) 
#> # A tibble: 990 x 2
#>    Pair         Count
#>    <chr>        <dbl>
#>  1 PeHa3/KbFk2      1
#>  2 PeHa51/KbFk2     1
#>  3 PeHa23/KbFk2     1
#>  4 PeHa44/KbFk2     1
#>  5 PeHa8/KbFk2      1
#>  6 PeHa26/KbFk2     1
#>  7 KbFk5/KbFk2      2
#>  8 PeHa15/KbFk2     1
#>  9 PeHa43/KbFk2     1
#> 10 PeHa11/KbFk2     1
#> # … with 980 more rows

【讨论】:

  • 这真是太棒了!谢谢你。出于某种原因,重命名功能确实有效(我确实安装了 plyr 包),它告诉我我有未使用的参数。但那部分是微不足道的。我只留下了“价值观”和“ind”。另一方面,是否有可能使这些对不以其他顺序重复?即PeHa1/KbFk1和KbFk1/PeHa1
  • 已针对重复计数和rename() 参考问题进行了更新。 (如果你有plyrdplyr,可能会有问题。)
猜你喜欢
  • 2016-10-01
  • 1970-01-01
  • 2017-07-20
  • 2021-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多