如何在R中的列表列表中的每个级别上标识和计数唯一对?

我有一个看起来像这样的列表列表:

> 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"',`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"',`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"',`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)

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

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

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

我要寻找哪种公式?

该问题的背景(仅出于兴趣,并没有增加太多的问题):

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

如何在R中的列表列表中的每个级别上标识和计数唯一对?

计算每个进化枝之间发现的每对频率,应该是每对人工产物之间关系的强度。然后,我将用该数目除以进化枝的总数,以标准化下一步。一旦完成X份树状图的分​​析,我将合并每对所有这些值,然后将它们除以代表该对是否出现在树状图中的数字(如果它出现在2个树状图中,则除以2) ),因为每对都不会出现在我的每个测试中,并且我必须对其进行标准化,以使在我的测试中出现频率更高的更完整的工件不会具有太大的权重。这应该使我能够评估哪些对具有最强的关系。

caosh666666 回答:如何在R中的列表列表中的每个级别上标识和计数唯一对?

这属于一系列关联类型的问题,我发现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
本文链接:https://www.f2er.com/3044159.html

大家都在问