更快的数据帧乘法方式

时间:2014-05-24 18:12:50

标签: r

我有一个像这样的数据框(名称t)

ID N com_a com_b com_c
A  3   1     0    0
A  5   0     1    0
B  1   1     0    0
B  1   0     1    0
B  4   0     0    1
B  4   1     0    0 

我尝试com_a*N com_b*N com_c*N

ID N com_a com_b com_c com_a_N com_b_N com_c_N
A  3   1     0    0       3       0       0
A  5   0     1    0       0       5       0
B  1   1     0    0       1       0       0
B  1   0     1    0       0       1       0
B  4   0     0    1       0       0       4     
B  4   1     0    0       4       0       0

我使用for - 函数,但我需要很多时间如何在大数据中快速执行

for (i in 1:dim(t)[1]){
    t$com_a_N[i]=t$com_a[i]*t$N[i]
    t$com_b_N[i]=t$com_b[i]*t$N[i]
    t$com_c_N[i]=t$com_c[i]*t$N[i]
    }

5 个答案:

答案 0 :(得分:4)

t <- transform(t,
      com_a_N=com_a*N,
      com_b_N=com_b*N,
      com_c_N=com_c*N)

应该更多更快。 data.table解决方案可能会更快。

答案 1 :(得分:4)

您可以将sweep用于此

(st <- sweep(t[, 3:5], 1, t$N, "*"))
#  com_a com_b com_c
#1     3     0     0
#2     0     5     0
#3     1     0     0
#4     0     1     0
#5     0     0     4
#6     4     0     0

可以使用pastesetNames创建新名称,您可以使用cbind将新列添加到现有data.frame。这将扩展到任意数量的列。

cbind(t, setNames(st, paste(names(st), "N", sep="_")))
#  ID N com_a com_b com_c com_a_N com_b_N com_c_N
#1  A 3     1     0     0       3       0       0
#2  A 5     0     1     0       0       5       0
#3  B 1     1     0     0       1       0       0
#4  B 1     0     1     0       0       1       0
#5  B 4     0     0     1       0       0       4
#6  B 4     1     0     0       4       0       0

答案 2 :(得分:3)

@BenBolker提出的data.table解决方案

library(data.table)
setDT(t)[, c("com_a_N", "com_b_N", "com_c_N") := list(com_a*N, com_b*N, com_c*N)]

##    ID N com_a com_b com_c com_a_N com_b_N com_c_N
## 1:  A 3     1     0     0       3       0       0
## 2:  A 5     0     1     0       0       5       0
## 3:  B 1     1     0     0       1       0       0
## 4:  B 1     0     1     0       0       1       0
## 5:  B 4     0     0     1       0       0       4
## 6:  B 4     1     0     0       4       0       0

答案 3 :(得分:2)

使用矩阵乘法更快:

cbind(dat,dat[,3:5]*dat$N)

虽然你应该在....之后设置colnames。

为避免使用显式列索引(不推荐),您可以使用一些grep魔法:

cbind(dat,dat[,grep('com',colnames(dat))]*dat$N)

答案 4 :(得分:1)

dplyr的另一个选项:

require(dplyr)

t <- mutate(t, com_a_N=com_a*N,
               com_b_N=com_b*N,
               com_c_N=com_c*N)
相关问题