我想将一个数据集中一列中的每个元素乘以第二个数据集中一列中的每个元素,然后合并结果以形成一个新数据集。在下面的示例中,我将 的每个值my.data1$zz
乘以 的每个值my.data2$cc
以获得desired.result$dd
.
我使用一个apply
语句,然后c()
将结果输出转换为一个向量。但是,我无法将向量my.data4
与my.data1
和my.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