我有以下矩阵
m <- matrix(c(2, 4, 3, 5, 1, 5, 7, 9, 3, 7), nrow=5, ncol=2,)
colnames(x) = c("Y","Z")
m <-data.frame(m)
我试图在每一行中创建一个随机数,其中上限是基于变量值的数字(在这种情况下,1 * Y基于Z的每一行的值)
我目前有:
samp<-function(x){
sample(0:1,1,replace = TRUE)}
x$randoms <- apply(m,1,samp)
哪个工作能够很好地将样本函数独立应用到每一行,但是当我尝试更改样本中的x时,我总是会遇到错误。我以为我可以这样做:
samp<-function(x){
sample(0:m$Z,1,replace = TRUE)}
x$randoms <- apply(m,1,samp)
但我猜这是一厢情愿的想法。
最终我想要结果:
Y Z randoms
2 5 4
4 7 7
3 9 3
5 3 1
1 7 6
有什么想法吗?
答案 0 :(得分:1)
以下内容将针对每一行从0到x$Y
进行采样,并将结果存储在randoms
中:
x$randoms <- sapply(x$Y + 1, sample, 1) - 1
说明:
sapply
分别获取x$Y
中的每个值(让我们称之为y
),并在其上调用sample(y + 1, 1)
。
请注意(例如)sample(y+1, 1)
将对范围1:(y+1)
中的1个随机整数进行采样。由于您需要一个从0到y
而不是1到y + 1
的数字,我们最后会减去1。
另外,只是指出 - 这里不需要replace=T
因为你只是取样一个值,所以它是否被替换无关紧要。
答案 1 :(得分:1)
根据@ mathematical.coffee建议和我编辑的例子,这是光滑的最终结果:
m <- matrix(c(2, 4, 3, 5, 1, 5, 7, 9, 3, 7), nrow=5, ncol=2,)
colnames(m) = c("Y","Z")
m <-data.frame(m)
samp<-function(x){
sample(Z + 1, 1)}
m$randoms <- sapply(m$Z + 1, sample, 1) - 1