创建一个差异矩阵比较R数据框中所有行之间的差异

Posted

技术标签:

【中文标题】创建一个差异矩阵比较R数据框中所有行之间的差异【英文标题】:Creating a difference matrix comparing differences between all rows in R dataframe 【发布时间】:2022-01-13 15:05:18 【问题描述】:

我有一个包含两列的数据框:第一列是美国政客的姓名 (bioname)。第二列是他们的 D-W 意识形态分数(dw1)。我想创建一个网络,其中bioname 是节点/顶点,而边/联系被加权为两位政治家的dw1 分数之间的差异。例如,我希望特朗普和拜登之间的边权重为 .3615 (.7015 - .34),特朗普和罗杰斯之间的边权重为 0.022 (.7015 - .6795),以此类推数据集。

如何重新格式化我的数据以计算数据集中所有政治人物的这些差异?

bioname dw1
Trump 0.7015
Biden 0.3400
Rogers 0.6795
Sewell 0.3035
***s 0.8255

【问题讨论】:

请以文本而非图片的形式分享您的示例数据。 @GregorThomas,我将其更新为文本。现在看起来正确吗? 我可以复制/粘贴,谢谢! 【参考方案1】:

dist 也应该可以工作

out <- with(df, as.matrix(dist(setNames(dw1, bioname))))

-输出

> out
        Trump  Biden Rogers Sewell ***s
Trump  0.0000 0.3615 0.0220 0.3980 0.1240
Biden  0.3615 0.0000 0.3395 0.0365 0.4855
Rogers 0.0220 0.3395 0.0000 0.3760 0.1460
Sewell 0.3980 0.0365 0.3760 0.0000 0.5220
***s 0.1240 0.4855 0.1460 0.5220 0.0000

【讨论】:

【参考方案2】:

我会创建一个命名向量并使用outer 来构建差异矩阵。调用你的数据框df:

named_vec = setNames(df$dw1, nm = df$bioname)
outer(named_vec, named_vec, FUN = "-")
#          Trump   Biden  Rogers Sewell  ***s
# Trump   0.0000  0.3615  0.0220 0.3980 -0.1240
# Biden  -0.3615  0.0000 -0.3395 0.0365 -0.4855
# Rogers -0.0220  0.3395  0.0000 0.3760 -0.1460
# Sewell -0.3980 -0.0365 -0.3760 0.0000 -0.5220
# ***s  0.1240  0.4855  0.1460 0.5220  0.0000

使用这些数据

df = read.table(text = 'bioname dw1
Trump   0.7015
Biden   0.3400
Rogers  0.6795
Sewell  0.3035
***s  0.8255', header = T)

【讨论】:

以上是关于创建一个差异矩阵比较R数据框中所有行之间的差异的主要内容,如果未能解决你的问题,请参考以下文章

转录组差异分析流程三大R包比较

将“delta”列添加到矩阵中,包含每个相邻列中元素之间的差异值?

R语言GEO数据挖掘:步骤三:进行基因差异分析

计算数据框中所有行与特定行之间的差异

将矩阵拆分为 4 个子矩阵,它们的总和之间的差异最小

如何在Python中找到两个矩阵之间的差异,结果不应该有任何带减号的值