R语言实现Mass_1列每个值与Mass_2列所有值交叉求差的方法
R实现两列全量值两两求差的方案
方法1:基础R实现(无需安装第三方包)
首先构造示例数据:
df <- data.frame( X = c(1,2,3), Mass_1 = c(109.8, 306.7, 658.7), Mass_2 = c(203.4, 305.5, 446.5) )
执行计算:
# 生成两两差值矩阵,行对应Mass_1取值,列对应Mass_2取值 diff_matrix <- outer(df$Mass_1, df$Mass_2, FUN = "-") # 为差值列设置规范名称 colnames(diff_matrix) <- paste0("Mass_2_", seq(ncol(diff_matrix))) # 拼接原标识列得到最终结果 result <- cbind(df[, c("X", "Mass_1")], diff_matrix)
方法2:tidyverse生态实现
适合习惯dplyr语法的场景:
library(dplyr) library(tidyr) result <- df %>% select(X, Mass_1) %>% rowwise() %>% mutate(diff_ls = list(Mass_1 - df$Mass_2)) %>% unnest_wider(diff_ls, names_sep = "_") %>% rename_with(~paste0("Mass_2_", sub("diff_ls_", "", .x)), starts_with("diff_ls_"))
可选:生成带计算式的字符串格式结果
如果需要输出示例中带(数值-数值)格式的字符串结果,可执行以下代码:
str_result <- cbind( df[, c("X", "Mass_1")], sapply(seq_along(df$Mass_2), function(i) { paste0("(", df$Mass_1, "-", df$Mass_2[i], ")") }) |> as.data.frame() |> setNames(paste0("Mass_2_", seq_along(df$Mass_2))) )
内容的提问来源于stack exchange,提问作者Sophia Escobar-Correas
相关产品推荐
相关产品推荐

