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