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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 03:05:28