3

我有一个像这样的数据框:

> df1
  a b c
1 0.5 0.3 0
2 0.2 0 0
3 0 0.6 0
4 0 0 0.4

我想置换每列中的行 1000 次,但是我想为每一列独立地执行此操作(如拉斯维加斯的老虎机)。

我注意到 R 中的示例函数并没有真正允许这样做,例如采样行给你。

> df2 <- df1[sample(nrow(df1)),]
> df2
  a b c
3 0 0.6 0
4 0 0 0.4
2 0.2 0 0
1 0.5 0.3 0

但请注意整行是如何被视为一个块的(即它们被保存在它们的列旁边,例如 0.5 总是在 0.3 旁边)

我不认为按列和按行都这样做是正确的答案,因为它会水平和垂直排列(即不像拉斯维加斯的老虎机)。

4

2 回答 2

3

Here's one way:

df2 <- df1
n   <- nrow(df1)

set.seed(1)
df2[] <- lapply(df1,function(x) x[sample.int(n)] )
#     a   b   c
# 1 0.2 0.3 0.0
# 2 0.0 0.6 0.0
# 3 0.0 0.0 0.4
# 4 0.5 0.0 0.0

Or just lapply(df1,sample) as @akrun said.

于 2015-05-09T17:21:09.147 回答
0

上面的答案选项返回一个列表,这可能适合您的目的。这是另一种选择:

set.seed(1)
matrix(sample((unlist(df1))), ncol = 3, dimnames = (list(NULL, letters[1:3])))

       a   b   c
[1,] 0.0 0.2 0.0
[2,] 0.3 0.6 0.5
[3,] 0.0 0.0 0.0
[4,] 0.0 0.4 0.0
于 2015-05-09T17:30:56.293 回答