嗯,这很令人尴尬。
我正在努力做一些相当简单的事情:通过查看x
和y
之间的相关性是否被删除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个预测变量。 在一个完美的世界中,我将能够创建一个函数z
在x
内混合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}}
答案 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