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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 14:54:03