使用for循环计算带有向量的列的乘积

时间:2017-04-04 12:47:49

标签: r data.table

我正在尝试创建数据集和向量的列的乘积。 数据集是:

col1<-rep(c(1:4),3)
col2<-rep(c(1:4),3)
col3<-rep(c(1:4),3)
col4<-rep(c(1:4),3)
df<-data.table(col1,col2,col3,col4)

和向量

w<-data.table(w<-c(100,0.1,0.2))



for (i in 1:nrow(w))
  {
new[i]<-df[,as.integer(i+1)]*w[as.integer(i)]}

我想要的数据集是

col1 col2 col3  col4
1    100   0.1  0.2
2    200   0.2  0.4
3    300   0.3  0.6
4    400   0.4  0.8
1    100   0.1  0.2
2    200   0.2  0.4
3    300   0.3  0.6
4    400   0.4  0.8
1    100   0.1  0.2
2    200   0.2  0.4
3    300   0.3  0.6
4    400   0.4  0.8

我得到的是这个

 col1 col2  col3  col4
  200    200  200  200
    0    0    0     0
    1    1    1     1  
    4    4    4     4
    1    1     1    1
    2    2     2    2
    3    3     3    3
    4    4     4    4
    1    1     1    1
    2    2     2    2
    3    3     3    3
    4    4     4    4

我错过了什么????

2 个答案:

答案 0 :(得分:2)

由于df的所有列都属于同一类型,因此可以将数据结构视为矩阵。因此,可以使用here描述的方法:

# create weight vector spanning all four columns, i.e., also col1
w1 <- c(1, 100, 0.1, 0.2)

# method 1
t(t(as.matrix(df)) * w1)

# method 2
sweep(as.matrix(df), MARGIN = 2, w1, `*`)

两种方法都返回一个矩阵,如下所示

#      col1 col2 col3 col4
# [1,]    1  100  0.1  0.2
# [2,]    2  200  0.2  0.4
# [3,]    3  300  0.3  0.6
# [4,]    4  400  0.4  0.8
# [5,]    1  100  0.1  0.2
# [6,]    2  200  0.2  0.4
# [7,]    3  300  0.3  0.6
# [8,]    4  400  0.4  0.8
# [9,]    1  100  0.1  0.2
#[10,]    2  200  0.2  0.4
#[11,]    3  300  0.3  0.6
#[12,]    4  400  0.4  0.8

如果需要可以转换回data.table对象,例如,

as.data.table(t(t(as.matrix(df)) * w1))

答案 1 :(得分:1)

我们需要指定.SDcol并乘以复制&#39; w $ V1&#39;

df[, (2:4) := .SD*rep(w$V1, each = .N), .SDcols = 2:4]

如果我们需要循环,请使用set中的data.table函数,通过乘以&#39; V1&#39;中的相应元素来更新列。 &#39; w&#39;

的专栏
for(j in 2:ncol(df)){
    set(df, i = NULL, j = j, value = df[[j]] * w$V1[j-1])
 }

df
#    col1 col2 col3 col4
# 1:    1  100  0.1  0.2
# 2:    2  200  0.2  0.4
# 3:    3  300  0.3  0.6
# 4:    4  400  0.4  0.8
# 5:    1  100  0.1  0.2
# 6:    2  200  0.2  0.4
# 7:    3  300  0.3  0.6
# 8:    4  400  0.4  0.8
# 9:    1  100  0.1  0.2
#10:    2  200  0.2  0.4
#11:    3  300  0.3  0.6
#12:    4  400  0.4  0.8