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

