You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RStudio中实现自交叉连接(Cross Join on Itself)生成非空值两两组合

R实现逐行多列非空值转两两组合方案

核心逻辑为逐行提取所有非空值,用combn()函数直接生成当前行所有不重复的两两组合,最终合并所有行的结果即可,比自交叉连接写法更简洁。

示例输入构造

首先构造你提供的示例输入数据:

df <- data.frame(
  col1 = c("Mike", "Bob", "Dyl"),
  col2 = c("Bill", "Bret", "Ty"),
  col3 = c("Pat", "Mike", NA),
  col4 = c("Ty", NA, NA)
)

tidyverse版本实现(推荐)

library(tidyverse)

result <- df %>%
  rowwise() %>%
  # 提取当前行所有非空值
  mutate(non_na = list(na.omit(c_across(everything())))) %>%
  # 生成所有两两不重复组合
  mutate(pairs = list(as.data.frame(t(combn(non_na, 2))))) %>%
  unnest(pairs) %>%
  # 仅保留组合结果列
  select(V1, V2)

# 查看输出
print(result, row.names = FALSE)

基础R版本实现(无需额外安装包)

result <- do.call(rbind, apply(df, 1, function(row) {
  valid_vals <- na.omit(row)
  # 仅当行内非空值≥2时生成组合
  if(length(valid_vals) >= 2) {
    t(combn(valid_vals, 2))
  }
}))
result <- as.data.frame(result, row.names = FALSE)
colnames(result) <- c("V1", "V2")

上述两种方法输出结果完全匹配你给出的预期示例:

V1   V2
 Mike Bill
 Mike  Pat
 Mike   Ty
 Bill  Pat
 Bill   Ty
  Pat   Ty
  Bob Bret
  Bob Mike
 Bret Mike
  Dyl   Ty

内容的提问来源于stack exchange,提问作者Zach

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 07:12:06