我正在尝试创建数据集和向量的列的乘积。 数据集是:
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
我错过了什么????
答案 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