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
相关产品推荐
相关产品推荐

