0

我想将一个数据集中一列中的每个元素乘以第二个数据集中一列中的每个元素,然后合并结果以形成一个新数据集。在下面的示例中,我将 的每个值my.data1$zz乘以 的每个值my.data2$cc以获得desired.result$dd.

我使用一个apply语句,然后c()将结果输出转换为一个向量。但是,我无法将向量my.data4my.data1my.data2创建desired.result. 到目前为止,我最接近的是new.data,我rep在失败后创建了merge.

当然,我缺少一个简单的解决方案。感谢您就如何使用apply家庭成员或merge获取desired.result. 我更喜欢使用 base R

my.data1 <- read.table(text = '
xx  yy   zz
A   1   100
A   2   200
B   1  1000
B   2  2000
', header = TRUE)

my.data2 <- read.table(text = '
aa  bb    cc
 1   1  0.40
 1   0  0.30
 0   1  0.20
 0   0  0.10
', header = TRUE)

desired.result <- read.table(text = '
xx  yy   zz  aa  bb  cc    dd
A   1   100   1   1  0.4   40
A   1   100   1   0  0.3   30
A   1   100   0   1  0.2   20
A   1   100   0   0  0.1   10
A   2   200   1   1  0.4   80
A   2   200   1   0  0.3   60
A   2   200   0   1  0.2   40
A   2   200   0   0  0.1   20
B   1  1000   1   1  0.4  400
B   1  1000   1   0  0.3  300
B   1  1000   0   1  0.2  200
B   1  1000   0   0  0.1  100
B   2  2000   1   1  0.4  800
B   2  2000   1   0  0.3  600
B   2  2000   0   1  0.2  400
B   2  2000   0   0  0.1  200
', header = TRUE)

my.data3 <- apply(my.data1[3], 1, function(x) x * my.data2$cc)
my.data4 <- c(my.data3)
# [1]  40  30  20  10  80  60  40  20 400 300 200 100 800 600 400 200

my.data5 <- cbind(my.data1, my.data2)
new.xx <- rep(c('A','B'), each = length(my.data4)/2)
new.yy <- rep(rep(c(  1,  2), each = length(my.data4)/4), 2)
new.ab <- expand.grid(aa = c(0,1), bb = c(0,1))
new.ab <- new.ab[order(-new.ab$aa, -new.ab$bb),]
new.ab2 <- rbind(new.ab, new.ab, new.ab, new.ab)
new.data <- data.frame(xx = new.xx, yy = new.yy, aa = new.ab2$aa, bb = new.ab2$bb, dd = my.data4)
new.data

   xx yy aa bb  dd
1   A  1  1  1  40
2   A  1  1  0  30
3   A  1  0  1  20
4   A  1  0  0  10
5   A  2  1  1  80
6   A  2  1  0  60
7   A  2  0  1  40
8   A  2  0  0  20
9   B  1  1  1 400
10  B  1  1  0 300
11  B  1  0  1 200
12  B  1  0  0 100
13  B  2  1  1 800
14  B  2  1  0 600
15  B  2  0  1 400
16  B  2  0  0 200
4

2 回答 2

2

您不需要apply将两列相乘,因为乘法是矢量化的。

> df<-merge(my.data1,my.data2,all=T)
> df$dd<-df$zz*df$cc
> df<-df[order(df$xx,df$yy),]
> df
   xx yy   zz aa bb  cc  dd
1   A  1  100  1  1 0.4  40
5   A  1  100  1  0 0.3  30
9   A  1  100  0  1 0.2  20
13  A  1  100  0  0 0.1  10
2   A  2  200  1  1 0.4  80
6   A  2  200  1  0 0.3  60
10  A  2  200  0  1 0.2  40
14  A  2  200  0  0 0.1  20
3   B  1 1000  1  1 0.4 400
7   B  1 1000  1  0 0.3 300
11  B  1 1000  0  1 0.2 200
15  B  1 1000  0  0 0.1 100
4   B  2 2000  1  1 0.4 800
8   B  2 2000  1  0 0.3 600
12  B  2 2000  0  1 0.2 400
16  B  2 2000  0  0 0.1 200
于 2013-10-21T19:36:00.847 回答
2
kk<-data.frame(outer(my.data1[,3],my.data2[,3],"*"))
names(kk)<-rep("dd",4)
ll<-do.call(rbind,lapply(1:ncol(kk),function(x) cbind(my.data1,my.data2,kk[x])))
ll[order(ll$xx,ll$yy),]

   xx yy   zz aa bb  cc  dd
1   A  1  100  1  1 0.4  40
5   A  1  100  1  1 0.4  30
9   A  1  100  1  1 0.4  20
13  A  1  100  1  1 0.4  10
2   A  2  200  1  0 0.3  80
6   A  2  200  1  0 0.3  60
10  A  2  200  1  0 0.3  40
14  A  2  200  1  0 0.3  20
3   B  1 1000  0  1 0.2 400
7   B  1 1000  0  1 0.2 300
11  B  1 1000  0  1 0.2 200
15  B  1 1000  0  1 0.2 100
4   B  2 2000  0  0 0.1 800
8   B  2 2000  0  0 0.1 600
12  B  2 2000  0  0 0.1 400
16  B  2 2000  0  0 0.1 200
于 2013-10-21T19:54:29.287 回答