在R中如何对数据集列做排列组合生成配对数据集以开展回归分析
R语言按站点配对非NA值生成全组合回归数据集
需求说明
需要对数据集中的两个物种变量生成全配对组合,用于计算多条回归线。
具体规则:数据集每个站点(site)有4次重复(repl),sp.1和sp.2列存在若干NA值,最终要实现sp.1对sp.2的回归。对每个站点,将sp.1的非NA值与sp.2的非NA值做全排列配对,每一组唯一的配对组合对应一个独立子集,遍历所有组合后将所有子集合并为一个主数据集,并标记对应的迭代编号。
示例数据集
构造测试数据集代码:
site <- c(1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,6,6,6,6) repl <- c(1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4) sp.1 <- c(NA,1,NA,4,NA,6,7,NA,3,4,5,NA,NA,1,NA,4,NA,6,7,NA,3,4,5,NA) sp.2 <- c(2,NA,1,NA,NA,NA,7,8,5,1,NA,3,2,NA,1,NA,5,6,7,8,5,1,NA,3) df.dummy <- data.frame(site, repl, sp.1, sp.2)
数据集预览:
site repl sp.1 sp.2 1 1 1 NA 2 2 1 2 1 NA 3 1 1 NA 1 4 1 2 4 NA 5 2 1 NA NA 6 2 2 6 NA 7 2 1 7 7 8 2 2 NA 8 ....
预期输出效果
单迭代子集示例
Iteration 1 site sp.1 sp.2 1 1 2 1 4 1 2 6 7 2 7 8 .... Iteration 2 site sp.1 sp.2 1 1 1 1 4 2 2 6 7 2 7 8 .... Iteration 3 site sp.1 sp.2 1 1 1 1 4 2 2 6 8 2 7 7 .... Iteration 4 site sp.1 sp.2 1 1 2 1 4 1 2 6 8 2 7 7 ....
最终合并后主数据集结构
带迭代编号it的总数据集结构如下:
it site sp.1 sp.2 1 1 1 2 1 1 4 1 1 2 6 7 1 2 7 8 .... 2 1 1 1 2 1 4 2 2 2 6 7 2 2 7 8 .... 3 1 1 1 3 1 4 2 3 2 6 8 3 2 7 7 .... 4 1 1 2 4 1 4 1 4 2 6 8 4 2 7 7 .... .....
实现代码
提示:如果运行报错缺少gtools包,先运行
install.packages("gtools")安装即可。
library(tidyverse) library(gtools) # 核心处理逻辑 result <- df.dummy %>% # 按站点分组提取非NA值 group_by(site) %>% summarise( sp1_list = list(na.omit(sp.1)), sp2_list = list(na.omit(sp.2)) ) %>% # 过滤掉两个物种非NA数量不一致的站点(无法一一配对) filter(lengths(sp1_list) == lengths(sp2_list)) %>% # 生成sp.2的所有排列,对应所有配对可能 mutate( perms = map(sp2_list, ~permutations(n = length(.x), r = length(.x), v = .x)) ) %>% # 展开所有排列生成带迭代号的总数据集 pmap(function(site, sp1_list, sp2_list, perms) { map_dfr(1:nrow(perms), function(i) { tibble( site = site, sp.1 = sp1_list, sp.2 = perms[i,] ) }, .id = "it") }) %>% bind_rows() %>% mutate(it = as.integer(it))
内容的提问来源于stack exchange,提问作者Rspacer
相关产品推荐
相关产品推荐

