这是我的代码的第一部分:
BSum=0.0
mydata = NULL
while(BSum < 5)
{
A=(rpois (1, lambda=1))
y=runif(A,0,1)
B1 = length(which(y<=0.5))
BSum = BSum + B1
C = A - B1
mydata=rbind(mydata,c("A"=A,"B"=B1,"C"=C))
}
我在这里还需要3列。对于列D(行x),我将生成任意数量的随机数。 (在0和1之间)和B列(行x)中的值一样。然后我看到有多少随机的。小于或等于0.1。我将这些总数计算在D列中。剩余部分(BD)变为F列。我生成另一列E,它将以与从B生成D相同的方式填充。剩余部分再次添加到Column中累积的数量F。
答案 0 :(得分:1)
:=
来自 data.table 包。由于您没有加载此对象,因此您的对象不是data.table
对象,或者它是,但您没有说并且未加载包。
如果前者(您的对象是数据框,而不是data.table
),那么您需要cbind()
。如:
set.seed(1)
df <- data.frame(A = runif(10))
cbind(df, list(B = runif(10), C = letters[1:10]))
> cbind(df, list(B = runif(10), C = letters[1:10]))
A B C
1 0.26550866 0.2059746 a
2 0.37212390 0.1765568 b
3 0.57285336 0.6870228 c
4 0.90820779 0.3841037 d
5 0.20168193 0.7698414 e
6 0.89838968 0.4976992 f
7 0.94467527 0.7176185 g
8 0.66079779 0.9919061 h
9 0.62911404 0.3800352 i
10 0.06178627 0.7774452 j
针对您的特定问题,请尝试:
myfun <- function(z) {
ret1 <- apply(z, 1, function(x) sum(runif(x) <= 0.1))
ret2 <- z[,1] - ret1
cbind(z, B = ret1, C = ret2)
}
set.seed(1)
df <- data.frame(A = rpois(10, 2))
myfun(df)
> myfun(df)
A B C
1 1 0 1
2 1 0 1
3 2 0 2
4 4 0 4
5 1 0 1
6 4 0 4
7 4 1 3
8 2 0 2
9 2 0 2
10 0 0 0
你可以通过不单独执行每一行来提高效率,但它需要更多编码。
如果我理解你的更新(我可能没有,因为我已经向您展示了如何执行这些步骤,但不是与您现在想要的配置相同),那么我认为这就是您想要的。请注意,您创建E
的方式有点含糊不清。我按字面意思接受了你,并且与D
完全相同。
set.seed(2)
BSum <- 0.0
mydata <- NULL
while(BSum < 5) {
A <- rpois(1, lambda = 1)
B1 <- sum(runif(A, 0, 1) <= 0.5)
BSum <- BSum + B1
C <- A - B1
D <- sum(runif(B1) <= 0.1)
F <- B1 - D
E <- sum(runif(B1) <= 0.1)
F <- F + (D - E)
mydata <- rbind(mydata, c(A = A, B = B1, C = C, D = D, E = E, F = F))
}
我得到那粒种子
R> mydata
A B C D E F
[1,] 0 0 0 0 0 0
[2,] 1 0 1 0 0 0
[3,] 0 0 0 0 0 0
[4,] 3 1 2 0 0 1
[5,] 1 1 0 0 0 1
[6,] 1 0 1 0 0 0
[7,] 3 3 0 0 0 3