0

1 つのデータ セットの列の各要素を 2 番目のデータ セットの列の各要素で乗算し、結果をマージして新しいデータ セットを形成したいと考えています。以下の例では、 の各値を のmy.data1$zz各値で乗算しmy.data2$ccて を取得してdesired.result$ddいます。

applyステートメントを使用してc()、結果の出力をベクトルに変換します。ただし、ベクターmy.data4my.data1とをマージしてmy.data2を作成するのに問題がありますdesired.result。これまでで最も近いのは、で失敗した後new.dataに作成したです。repmerge

確かに私は簡単な解決策を見逃しています。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
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 に答える