2013-10-21 90 views
0

我想將一個數據集中的列中的每個元素乘以第二個數據集中的列中的每個元素,然後合併結果以形成新的數據組。在下面的示例中,我將my.data1$zz的每個值乘以my.data2$cc的每個值以獲得desired.result$dd第二列中的每個元素在一列中的每個元素的多元化

我使用apply語句,然後使用c()將結果輸出轉換爲向量。但是,我無法合併矢量my.data4my.data1my.data2以創建desired.result。我到目前爲止最接近的是new.data,這是我在用merge失敗後用rep創建的。

當然,我錯過了一個簡單的解決方案。感謝您對如何使用apply系列的成員或merge獲得desired.result的任何建議。我更喜歡使用基地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 

回答

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 
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 
相關問題