如何在R中混洗 Dataframe 条目

txu3uszq  于 2022-12-06  发布在  其他
关注(0)|答案(2)|浏览(129)

我有一个维数为24,523x3,468的 Dataframe ,我想对该 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

它将产生如下错误

我也尝试过这种方法来进行洗牌,但它只会洗牌行和列

df_shuf = df[sample(rownames(df), nrow(df)), sample(colnames(df), ncol(df))]
df_shuf

我如何使用一个循环来按行和列重排 Dataframe df的条目?

uxhixvfz

uxhixvfz1#

解决问题的一种方法:

df[] = lapply(df, sample)
jhdbpxl9

jhdbpxl92#

虽然我发现lapply(df, sample)方法是最直接的(也是最规范的),但对for循环的一个字面上的修复是认识到transform不能在赋值的LHS上使用col[i]

df2 <- df
col = colnames(df)
for (i in 1:ncol(df)) {
  df2[[ col[i] ]] = sample(df2[[ col[i] ]])
}

我们并不真的需要名称,但是,您可以使用索引来代替:

df2 <- df
for (i in 1:ncol(df)) {
  df2[[ i ]] = sample(df2[[ i ]])
}

当然,这是假设您打算放弃行中值之间的相关性。例如,列c1c2的最小值一起出现在第1行;然而,在采样之后,它们可以出现在不同行中。
如果你的目的是让每一行都在一起,那么我们只需要对行进行采样,保持帧的“观察”质量:

df2 <- df[sample(nrow(df)),]

相关问题