如何在R中用for循环对DataFrame的所有条目进行洗牌?
如何用For循环对DataFrame的所有条目按行/列洗牌
问题背景
我有一个维度为24,523×3,468的DataFrame,想要对所有条目进行洗牌。用以下代码可以实现单列洗牌:
df <- data.frame(c1=c(1, 1.5, 2, 4), c2=c(1.1, 1.6, 3, 3.2), c3=c(2.1, 2.4, 1.4, 1.7)) df_shuffled = transform(df, c2 = sample(c2))
但我想对所有列或所有行都做洗牌。尝试了下面的循环代码却报错:
col = colnames(df) for (i in 1:ncol(df)){ df2 = transform(df, col[i] = sample(col[i])) } df2
错误提示:
Error in transform.data.frame(df, col[i] = sample(col[i])) :
不能在"col[i]"里使用变量作为列名
另外我还试过这种方式,但它只是打乱了行和列的顺序,并没有真正打乱每个条目:
df_shuf = df[sample(rownames(df), nrow(df)), sample(colnames(df), ncol(df))] df_shuf
解决方案
1. 按列洗牌(每列单独打乱条目)
之前的循环报错是因为transform无法直接用变量作为列名,直接通过列索引操作更简单:
# 初始化原始数据框 df <- data.frame(c1=c(1, 1.5, 2, 4), c2=c(1.1, 1.6, 3, 3.2), c3=c(2.1, 2.4, 1.4, 1.7)) # 创建结果数据框副本 df_col_shuffled <- df # 循环遍历每一列,单独打乱 for (i in 1:ncol(df_col_shuffled)) { df_col_shuffled[, i] <- sample(df_col_shuffled[, i]) } # 查看打乱后的结果 df_col_shuffled
执行后,每一列的条目都会被随机打乱,行与行之间的原始对应关系会被打破。
2. 按行洗牌(每行单独打乱条目)
如果要按行打乱,逻辑类似,只需遍历每一行:
# 初始化原始数据框 df <- data.frame(c1=c(1, 1.5, 2, 4), c2=c(1.1, 1.6, 3, 3.2), c3=c(2.1, 2.4, 1.4, 1.7)) # 创建结果数据框副本 df_row_shuffled <- df # 循环遍历每一行,单独打乱 for (i in 1:nrow(df_row_shuffled)) { df_row_shuffled[i, ] <- sample(df_row_shuffled[i, ]) } # 查看打乱后的结果 df_row_shuffled
执行后,每行内的条目会被随机打乱,列与列之间的原始对应关系会被打破。
3. 彻底打乱所有条目(无行列区分)
如果想要把整个数据框的所有元素完全打乱(不保留任何行列内的顺序),可以不用循环,直接将数据框转为向量打乱后重新填充:
df_total_shuffled <- df # 将所有元素转为向量打乱,再放回原结构 df_total_shuffled[] <- sample(as.vector(df_total_shuffled))
内容的提问来源于stack exchange,提问作者MK Huda
相关产品推荐
相关产品推荐

