0

我正在尝试创建一个 data.frame,它根据参考 data.frame 的值采用不同的值。我只知道如何使用“for 循环”来执行此操作,但有人建议避免在 R 中使用 for 循环......而且我的实际数据有 ~500,000 行 x ~200 列。

a <- as.data.frame(matrix(rbinom(10,1,0.5),5,2,dimnames=list(c(1:5),c("a","b"))))
b <- data.frame(v1=c(2,10,12,5,11,3,4,14,2,13),v2=c("a","b","b","a","b","a","a","b","a","b"))
c <- as.data.frame(matrix(0,5,2))

for (i in 1:5){
  for(j in 1:2){
    if(a[i,j]==1){
      c[i,j] <- mean(b$v1[b$v2==colnames(a)[j]])
    } else {
      c[i,j]= mean(b$v1)
    }}}
c 

我根据data.frame“a”的每个单元格中的值和相应的列名创建data.frame“c”。还有另一种方法可以做到这一点吗?索引?使用数据表?也许应用功能?非常感谢任何和所有帮助!

4

2 回答 2

1
#subsetting a matrix is faster
res <- as.matrix(a)

#calculate fill-in values outside the loop
in1 <- mean(b$v1)
in2 <- sapply(colnames(a),function(i) mean(b$v1[b$v2==i]))

#loop over columns and use a vectorized approach 
for (i in seq_len(ncol(res))) {
  res[,i] <- ifelse(res[,i]==0, in1, in2[i])
}
于 2013-07-17T20:15:51.137 回答
1
(a == 0) * mean(b$v1) + t(t(a) * c(tapply(b$v1, b$v2, mean)))

分段运行以了解正在发生的事情。另外,请注意,这假定其中的有序名称a(以及 0 和 1 作为其中的条目,根据 OP)。

上面一堆t's 的替代方法是使用mapply(假设a是 adata.framedata.table而不是 a matrix,而上面不关心):

(a == 0) * mean(b$v1) + mapply(`*`, a, tapply(b$v1, b$v2, mean))
于 2013-07-17T20:11:43.863 回答