在R中对数据集子集的Class列随机重分配且保留原行
解决方法:在原数据框中对指定子集的Class列随机重分配
我完全get到你的需求了——你不需要抽取行出来处理,而是要在原数据框里保留所有行的前提下,给一部分行的Class列随机重新分配值,其他行的Class保持原样,对吧?
下面是具体的实现步骤和代码:
步骤说明
- 确定你要重分配
Class值的行数量(比如你提到的子集大小N) - 随机挑选这些行的索引
- 从原数据框的
Class列所有取值中,随机抽样(有放回,保证可以重复出现原类别),替换掉选中行的Class值
代码示例(R语言)
假设你的数据框名为df,我们用你提供的示例数据来演示:
# 构造示例数据框 df <- data.frame( Index = 1:4, B = c(3, 1, 9, 1), C = c(4, 9, 1, 1), Class = c("Dog", "Cat", "Dog", "Cat") ) # 设置随机种子(保证结果可复现,可选) set.seed(123) # 定义要重分配Class的行数N N <- 3 # 随机选择N行的索引 resample_rows <- sample(nrow(df), N) # 对选中行的Class列进行随机重采样(从原Class取值中抽样,有放回) df$Class[resample_rows] <- sample(df$Class, N, replace = TRUE) # 查看结果 print(df)
运行后可能得到类似你期望的结果(因为随机性,每次结果会有差异):
Index B C Class 1 1 3 4 Cat 2 2 1 9 Dog 3 3 9 1 Dog 4 4 1 1 Dog
为什么你的原代码不符合需求?
你之前的sample(Class[sample(nrow(Class),N),])是先抽取了N行,再对这些行的Class重采样,最终得到的是一个单独的重采样后的Class向量(甚至可能是行子集),而不是在原数据框上修改指定行的Class值。我们上面的方法直接在原数据框的指定位置修改,完全保留了所有行的其他列数据,符合你的需求。
内容的提问来源于stack exchange,提问作者F.D
相关产品推荐
相关产品推荐

