R 在data.table中:迭代另一个data.table的行

R 在data.table中:迭代另一个data.table的行,r,data.table,R,Data.table,我有两个数据表: k1 <- mtcars[1:4,1:6] k11 <- as.data.table(k1) k2 <- iris[1:3,1:2] k22 <- as.data.table(k2) 正如您所看到的,答案是不同的(我猜是因为data.table的复制性质) 您可以使用设置(这将有效地避免[.data.table中的开销),并在使数据集具有相同的行数后执行* library(data.table) k1N <- k11[rep(1:.N,nrow(

我有两个数据表:

k1 <- mtcars[1:4,1:6]
k11 <- as.data.table(k1)
k2 <- iris[1:3,1:2]
k22 <- as.data.table(k2)

正如您所看到的,答案是不同的(我猜是因为data.table的复制性质)

您可以使用
设置
(这将有效地避免
[.data.table
中的开销),并在使数据集具有相同的行数后执行
*

library(data.table)
k1N <- k11[rep(1:.N,nrow(k22))]
k2N <- k22[rep(1:.N,each=nrow(k11))][, 2:1]

for(j in 1:2){
 set(k1N, i=NULL, j=j, value=k1N[[j]]*k2N[[j]])
}

k1N
#      mpg  cyl disp  hp drat    wt
# 1: 73.50 30.6  160 110 3.90 2.620
# 2: 73.50 30.6  160 110 3.90 2.875
# 3: 79.80 20.4  108  93 3.85 2.320
# 4: 74.90 30.6  258 110 3.08 3.215
# 5: 63.00 29.4  160 110 3.90 2.620
# 6: 63.00 29.4  160 110 3.90 2.875
# 7: 68.40 19.6  108  93 3.85 2.320
# 8: 64.20 29.4  258 110 3.08 3.215
# 9: 67.20 28.2  160 110 3.90 2.620
#10: 67.20 28.2  160 110 3.90 2.875
#11: 72.96 18.8  108  93 3.85 2.320
#12: 68.48 28.2  258 110 3.08 3.215
库(data.table)

k1N感谢您的回答。这对于
k11
的单个列(
mpg
)有效,但正如您在我的问题中所看到的,我还需要对
k11
的第二列(
cyl
)进行此操作。特别是第一个数据表的第二列(
k11
)需要乘以第二个数据表(
k22
)的
Sepal.Length
列。我应该怎么做?@user227710我根据
k4
的结果进行编码。我得到的结果看起来与k4相同。我的意思是应用你的代码。而不是你用
head(k4)显示的结果
akrun:不,对于
cyl
列,它是不同的。在您的解决方案中,
cyl
列中的值没有更改。@user227710请运行您的代码并检查答案。我只得到相同的结果value@user227710好的,谢谢你的澄清。我也这么认为,但对你的代码有点困惑
k5<-rbindlist(lapply(1:nrow(k2),function(j){

  k11[,`:=`(mpg=mpg*k22[j,Sepal.Width],cyl=cyl*k22[j,Sepal.Length])]

}))

 head(k5)
      mpg     cyl disp  hp drat    wt
1: 705.60 704.718  160 110 3.90 2.620
2: 705.60 704.718  160 110 3.90 2.875
3: 766.08 469.812  108  93 3.85 2.320
4: 719.04 704.718  258 110 3.08 3.215
5: 705.60 704.718  160 110 3.90 2.620
6: 705.60 704.718  160 110 3.90 2.875
library(data.table)
k1N <- k11[rep(1:.N,nrow(k22))]
k2N <- k22[rep(1:.N,each=nrow(k11))][, 2:1]

for(j in 1:2){
 set(k1N, i=NULL, j=j, value=k1N[[j]]*k2N[[j]])
}

k1N
#      mpg  cyl disp  hp drat    wt
# 1: 73.50 30.6  160 110 3.90 2.620
# 2: 73.50 30.6  160 110 3.90 2.875
# 3: 79.80 20.4  108  93 3.85 2.320
# 4: 74.90 30.6  258 110 3.08 3.215
# 5: 63.00 29.4  160 110 3.90 2.620
# 6: 63.00 29.4  160 110 3.90 2.875
# 7: 68.40 19.6  108  93 3.85 2.320
# 8: 64.20 29.4  258 110 3.08 3.215
# 9: 67.20 28.2  160 110 3.90 2.620
#10: 67.20 28.2  160 110 3.90 2.875
#11: 72.96 18.8  108  93 3.85 2.320
#12: 68.48 28.2  258 110 3.08 3.215