如何用dplyr或内置函数计算数据框scores列的全元素差值矩阵?
实现差值矩阵的简便方法
基础R方法(最简洁)
利用内置的outer()函数可以直接生成元素级的差值矩阵,这是最简便的方案:
首先构造你的数据框:
df <- data.frame( ID = 1:5, scores = c(2.1, 1.3, -1, -3, 2.4) )
然后用outer()计算差值并设置行列名:
# 计算每个元素与所有元素的差值(行元素 - 列元素) diff_matrix <- outer(df$scores, df$scores, `-`) # 将行列名设置为ID rownames(diff_matrix) <- df$ID colnames(diff_matrix) <- df$ID # 输出结果 diff_matrix
输出结果:
1 2 3 4 5 1 0.0 0.8 3.1 5.1 -0.3 2 -0.8 0.0 2.3 4.3 -1.1 3 -3.1 -2.3 0.0 2.0 -3.4 4 -5.1 -4.3 -2.0 0.0 -5.4 5 0.3 1.1 3.4 5.4 0.0
tidyverse(dplyr/tidyr)方法
如果习惯使用管道式操作,可以用dplyr和tidyr实现:
library(dplyr) library(tidyr) diff_matrix_tidy <- df %>% # 生成所有行与列的元素组合 cross_join(df, suffix = c("_row", "_col")) %>% # 计算行元素减列元素的差值 mutate(diff = scores_row - scores_col) %>% # 转换为宽格式矩阵 pivot_wider(names_from = ID_col, values_from = diff) %>% # 将ID列转为行名 column_to_rownames("ID_row") diff_matrix_tidy
该方法会得到与基础R完全一致的结果,步骤更直观,适合熟悉tidyverse生态的用户。
内容的提问来源于stack exchange,提问作者Sandy
相关产品推荐
相关产品推荐

