R 在行名上应用高级函数

R apply advanced function on rownames

起初,我认为以下问题绝对简单,我只是无法 google 或正确解释它,但如果是这样,请给我一个 link,我会关注的

我举了一个我当前问题的最小示例,但总体上我对这个问题很感兴趣。

dataset <- matrix(runif(10*3), nrow=10, ncol=3)
rownames(dataset) <- letters[1:dim(dataset)[1]]

betas <- matrix(0, nrow=dim(dataset)[1], ncol=2)
rownames(betas) <- letters[1:dim(dataset)[1]]
colnames(betas) <- c("sum", "2*sum")

for(name in rownames(betas)){
    res1 <- sum(dataset[name, ])
    res2 <- res1 *2 
    betas[name, ] <- c(res1, res2)
}

这当然很好用,但我有大约 20000 行,所以它花费了太多时间。

我可以使用 apply 或其家族之一来替换循环吗?

编辑: 我在某个地方丢失了最后一个代码部分,我在其中评论了为什么我必须这样做。 我真正的问题如下,因此我不能先求和再相乘:

for(name in rownames(betas)){
    res1 <- coxph("amazing survival model calculations")
    res2 <- summary(res1) 
    betas[name, ] <- c(res1$coef, res2$coef[5])
}

这是一个 R one-liner 来做同样的事情:

cbind(betas, t(apply(dataset, 1, function(x) c('res1'=sum(x), 'res1*2'=sum(x)*2))))

rowSums()保留了data.framesmatricesnames属性,所以可以很方便的做到:

x <- rowSums(dataset)
cbind( "sum" = x , "sum*2"=x*2)
#        sum    sum*2        
#a 1.9457679 3.891536
#b 1.5798699 3.159740
#c 1.8086066 3.617213
#d 1.7802458 3.560492
#e 0.8076846 1.615369
#f 2.1001424 4.200285
#g 1.5129077 3.025815
#h 1.9098082 3.819616
#i 1.1109019 2.221804
#j 1.5256368 3.051274