我有两个具有公共列的数据框。
# Generate DF1
set.seed(219)
x0 <- rnorm(5, 22, 17)
x2 <- rnorm(5, 44, 15)
x3 <- rnorm(5, 56, 13)
x7 <- rnorm(5, 0, 3)
x9 <- rnorm(5, 28, 31)
x10 <- rnorm(5, 4, 75)
x11 <- rnorm(5, 7, 1)
dat1 <- data.frame(x0,x2,x3,x7,x9, x10, x11)
dat1$ID1 <- rownames(dat1)
# Generate DF2
x1 <- rnorm(10, 2, 19)
x2 <- rnorm(10, 4, 18)
x3 <- rnorm(10, 5, 17)
x4 <- rnorm(10, 7, 16)
x5 <- rnorm(10, 8, 51)
x6 <- rnorm(10, 9, 5)
x7 <- rnorm(10, 0, 3)
x8 <- rnorm(10, 34, 2)
x9 <- rnorm(10, 28, 1)
dat2 <- data.frame(x1,x2,x3,x4,x5,x6,x7,x8,x9)
dat2$ID2 <- rownames(dat2)
请注意DF1
有5行,而DF2
有10行。同样,每个数据帧中相似的列名并不意味着两个列的值都相同。
这是我想做的:
由于DF1
有5行,因此我需要在其中创建5列DF2
,我们称它们为y1, y2, y3, y4, y5
。
这是计算方法y1
:我需要将第一行放入所有行中,DF1
并将其与相似的列相乘DF2
。的大小为y1
(10行和1列)。我需要为DF2中的每一行计算以下内容。
y1 = x0 + x2(DF1)* x2(DF2)+ x3(DF1)* x3(DF2)+ x7(DF1)* x7(DF2)+ x9(DF1)* x9(DF2)
同样,对于y2,我们需要从DF1 ... Etc的第二行开始。
在向量和矩阵方面,这是如何计算y1的方法。
令DF1中的第一行为(x01,x21,x31,x71,x91,x101,x111,ID11)。然后y1的第一个第一值(记住y1是10 * 1):
y11 = x01 + x21(DF1)* x21(DF2)+ x31(DF1)* x31(DF2)+ x71(DF1)* x71(DF2)+ x91(DF1)* x91(DF2)。
y1的第二个值:
y12 = x01 + x21(DF1)* x22(DF2)+ x31(DF1)* x32(DF2)+ x71(DF1)* x72(DF2)+ x91(DF1)* x92(DF2)。
...
最后,y1的第十个值是:
y110 = x01 + x21(DF1)* x210(DF2)+ x31(DF1)* x310(DF2)+ x71(DF1)* x710(DF2)+ x91(DF1)* x910(DF2)。
如何实现我的算法?
这是基于我对您想做什么的理解,我在评论中提到了这一点。
基本上,对于我中的非常见列,dat1
将它们乘以一个矢量,以使其达到一致的维数,然后逐行为每个y
(y1
,等)相加10x1矢量,因此每个都是10x1矢量:
common_cols <- intersect(colnames(dat1),colnames(dat2))
uniq_cols <- setdiff(colnames(dat1),colnames(dat2))
uniq_cols <- uniq_cols[!uniq_cols=="ID1"]
tmp <- data.frame(y1=rep(NA,10), y2=rep(NA,10),y3=rep(NA,10),y4=rep(NA,10),y5=rep(NA,10))
tmp1 <- data.frame(matrix(nrow=10, ncol = 7))
for(i in 1:nrow(dat1)){
for(j in 1:length(common_cols)){
tmp1[,j] <- dat1[i,common_cols[j]] * dat2[,common_cols[j]]
}
for(k in 1:length(uniq_cols)){
tmp1[,k+4] <- dat1[i,uniq_cols[k]]*rep(1,10)
}
tmp[,i] <- rowSums(tmp1)
}
结果是:
tmp
y1 y2 y3 y4 y5 1 2796.812 226.31244 1924.2130 4392.7841 1459.8979 2 1786.241 17.11732 716.6079 2044.0003 141.6572 3 1371.890 -334.09190 324.3946 1578.0200 -262.0858 4 1235.717 -446.01583 176.2845 1422.1088 -411.2424 5 1995.976 -377.33202 1152.6527 3297.5986 635.7040 6 2233.255 197.51252 1155.2367 2847.4433 599.1098 7 3437.539 1675.03212 2328.7100 3876.5423 1914.7753 8 291.687 -1331.27575 -737.9568 299.7451 -1413.6779 9 1659.648 -244.14992 678.3120 2266.3193 144.3870 10 1675.775 -532.41657 668.3817 2491.0892 60.3962
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句