如何仅使用R基础函数将data.frame拆分为两个均等部分?
仅用R base函数将data.frame均分为大小完全相等的两部分
不需要加载任何第三方扩展包,直接用base R内置的索引切片逻辑就能实现,全程没有额外依赖。
核心逻辑
通过nrow()获取数据总行数,计算单份数据的目标行数,再按行索引对原数据做切片即可。如果要求两个部分大小完全相等,首先要保证原数据的总行数为偶数,否则无法做到绝对等大。
按原顺序拆分(固定拆分场景)
直接按数据原有排列顺序切分,代码示例(用R内置的mtcars数据集做测试,该数据集共32行,为偶数可完全等分):
# 目标数据,替换成你自己的data.frame即可 df <- mtcars # 计算总行数 total_n <- nrow(df) # 行数奇偶校验 if (total_n %% 2 != 0) { stop("当前数据行数为奇数,无法拆分为行数完全相等的两个部分") } half_n <- total_n / 2 # 切片得到两个子集 df1 <- df[1:half_n, ] df2 <- df[(half_n + 1):total_n, ]
运行后可自行校验:nrow(df1)和nrow(df2)的返回值完全一致,列结构和原数据完全相同。
随机均匀拆分(适合抽样、训练测试集拆分场景)
如果需要打乱原数据顺序后再均分,用base内置的sample()函数生成乱序索引再切片即可:
# 生成打乱的全行索引 shuffle_index <- sample(x = 1:total_n, size = total_n) # 按乱序索引切片 df1_random <- df[shuffle_index[1:half_n], ] df2_random <- df[shuffle_index[(half_n + 1):total_n], ]
补充:如果你的数据行数是奇数、不需要严格完全等大,只需要把单份行数计算改成
half_n <- floor(total_n / 2)即可,拆分后两个子集行数差1,逻辑和上述代码完全一致。
内容的提问来源于stack exchange,提问作者PhelsumaFL
相关产品推荐
相关产品推荐

