1

嗯,这很尴尬。

我正在尝试做一些相当简单的事情:通过查看 和 之间的相关性是否xy删除,如果 的值xy. 我试图通过创建第三个变量z来随机“混合”现有的“x”值来做到这一点。虽然这与之前在此处回答的问题类似,但我的数据格式很长,因此我需要在变量中随机化。id

例如,我的数据集可能是:

x    y    id
1    4    1
1    5    1
2    8    1
2    8    1
3    12   1
3    11   1
4    16   1
4    15   1
1    4    2
1    5    2
2    8    2
2    8    2
3    12   2
3    11   2
4    16   2
4    15   2

我想做的是创建一个新变量z,它基本上“混合”了 的值x(但基于 的实际值x,而不是某个范围内的随机变量):

x    y    id   z
1    4    1    2
1    5    1    3
2    8    1    1
2    8    1    4
3    12   1    4
3    11   1    3
4    16   1    2
4    15   1    1
1    4    2    1
1    5    2    1
2    8    2    3
2    8    2    3
3    12   2    4
3    11   2    4
4    16   2    2
4    15   2    2

我到底该怎么做?我开始认为这是一项简单的任务,但后来变得非常非常困惑。

超级超级奖励问题:

最后,细心的读者会注意到,数据是长格式的(每id行有 8 行),但它们也被分组(每行x有 4 个值id)。换句话说,每个人有 8 个观察到的结果y,但只有 4 个预测变量x在一个完美的世界中,我将能够创建一个函数,其中z混合了xwithin的值id,但从未分配相同的xto值z

换句话说,如果x=1,那么z=2,3, or 4但不是1。这是一个微妙的差异,但可能是有意义的!

x    y    id   z
1    4    1    2
1    5    1    3
2    8    1    1
2    8    1    4
3    12   1    4
3    11   1    2
4    16   1    3
4    15   1    1
1    4    2    3
1    5    2    3
2    8    2    1
2    8    2    1
3    12   2    4
3    11   2    4
4    16   2    2
4    15   2    2
4

1 回答 1

1

为新问题更新(实际上是全新的答案)

我没有立即想到什么,所以我想我应该提出一个while基于 - 的解决方案。这个函数基本上检查是否有任何结果sample与输入向量的值相同。如果是,请运行sample并重试....

Shuffled <- function(inVec) {
  Res <- vector()
  while ( TRUE ) {
    Res <- sample(inVec)
    if ( !any(Res == inVec) ) { break }
  }
  Res
}

set.seed(1)
mydf$z <- ave(mydf$x, mydf$id, FUN = Shuffled)

mydf
#    x  y id z
# 1  1  4  1 2
# 2  1  5  1 4
# 3  2  8  1 4
# 4  2  8  1 3
# 5  3 12  1 2
# 6  3 11  1 1
# 7  4 16  1 3
# 8  4 15  1 1
# 9  1  4  2 2
# 10 1  5  2 2
# 11 2  8  2 3
# 12 2  8  2 4
# 13 3 12  2 4
# 14 3 11  2 1
# 15 4 16  2 1
# 16 4 15  2 3

any(mydf$x == mydf$z)
# [1] FALSE
于 2013-11-11T04:13:19.477 回答