随机将现有变量的值分配给ID中R中数据帧中的新行

时间:2013-11-11 02:48:57

标签: r

嗯,这很令人尴尬。

我正在努力做一些相当简单的事情:通过查看xy之间的相关性是否被删除x的值与“{1}}”不匹配来进行稳健性检查y。我试图通过创建第三个变量z来实现这一点,该变量随机“混合”现有的'x'值。虽然这是与one previously answered here类似的问题,但我的数据是长格式所以我需要在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分组(每id有4个值})。换句话说,每个人有y的8个观察结果,但只有x的4个预测变量。 在一个完美的世界中,我将能够创建一个函数zx内混合id的值 - 但从未赋予x相同的值z 1}}到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 。这是一个微妙的差异,但可能是有意义的!

{{1}}

1 个答案:

答案 0 :(得分: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