如何在R中添加和计算列的值

时间:2014-01-11 15:20:02

标签: r

这是我的代码的第一部分:

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。

1 个答案:

答案 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