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

在R中拆分数据集:将相同名称的列均分到两个子数据集

实现思路

  • 先按列名对所有列进行分组,得到每个列名对应的全部列索引
  • 对每个分组内的列索引做随机打乱,按照「尽可能均分」的规则拆分到两个子数据集的列索引池:若当前列名共有n列,其中一个子数据集取(n+1)//2列,另一个取n//2列
  • 最后根据两个列索引池分别从原表提取列,得到符合要求的两个子数据集

代码实现(Python + Pandas)

import pandas as pd
import numpy as np
from collections import defaultdict

# 示例构造原数据,直接替换成你自己的df即可
df = pd.DataFrame(
    data=[[1,2,1,1,2,3,1,2],
          [1,2,1,1,2,3,1,2],
          [1,2,1,1,2,3,1,2]],
    index=['X1','X2','X3'],
    columns=['A','A','B','C','C','C','D','D']
)

# 1. 按列名收集列索引
col_groups = defaultdict(list)
for idx, col in enumerate(df.columns):
    col_groups[col].append(idx)

# 2. 拆分列索引到两个池
group1_cols = []
group2_cols = []
for col_name, idxs in col_groups.items():
    # 打乱索引保证随机性
    shuffled = np.random.permutation(idxs)
    split_pos = (len(shuffled) + 1) // 2
    group1_cols.extend(shuffled[:split_pos])
    group2_cols.extend(shuffled[split_pos:])

# 3. 提取两个子数据集,可选按原列顺序排序
group1_cols.sort()
group2_cols.sort()
df1 = df.iloc[:, group1_cols]
df2 = df.iloc[:, group2_cols]

运行后df1和df2就是符合要求的两个子数据集,单例列会随机分配到其中一个,多例列会尽可能均分。

代码实现(R)

# 构造示例原数据,替换成自己的df即可
df <- data.frame(
  row.names = c("X1", "X2", "X3"),
  A = c(1,1,1),
  A = c(2,2,2),
  B = c(1,1,1),
  C = c(1,1,1),
  C = c(2,2,2),
  C = c(3,3,3),
  D = c(1,1,1),
  D = c(2,2,2),
  check.names = FALSE
)

# 按列名分组
col_groups <- split(seq_along(colnames(df)), colnames(df))

group1_cols <- c()
group2_cols <- c()
for (idxs in col_groups) {
  shuffled <- sample(idxs)
  split_pos <- (length(shuffled) + 1) %/% 2
  group1_cols <- c(group1_cols, shuffled[1:split_pos])
  group2_cols <- c(group2_cols, shuffled[(split_pos+1):length(shuffled)])
}

# 排序后提取子数据框
group1_cols <- sort(group1_cols)
group2_cols <- sort(group2_cols)
df1 <- df[, group1_cols, drop = FALSE]
df2 <- df[, group2_cols, drop = FALSE]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 07:15:07