2017-04-27 30 views
1
x1 x2 x3 x11 x12 x13 x22 x23 x33 
1 5 9 1 5 9 25 45 81 
2 6 10 4 12 20 36 60 100 
3 7 11 9 21 33 49 77 121 
4 8 12 16 32 48 64 96 144 

x1x2,和給出,我想建立一個矩陣或數據幀x11, x12, x13, x22, x23,和x33其是向量x1, x2的元素之積,和 。創建矩陣列的逐元素乘積

事實上,我想以此爲更多的載體(例如x1 ~ x6)到高的順序(第三或第四)。 有沒有可以做到這一點的R命令?

+0

'M [T(山口(米))[lower.tri(噸(COL(M)),DIAG = TRUE)]] * M [,代表(1:NcoI位(M),NcoI位(M) :1)]((確保乘法的第一部分可以簡化) – user2957945

+0

@ user2957945這是從我已發佈的答案中得到靈感。即使'm [,rep(1:ncol(m),ncol(m):1)]'也完全一樣。如果你有新的東西,那麼繼續! – 989

+0

@ 989;實際上它沒有。這是一個不使用循環的嘗試(即生成序列c(1,2,3,2,3,3)),但更一般地說,如果可以改進的話,建立在其他答案上是可以的 - 它是不是一個競爭(如果我有興趣點我會把它放在答案部分) – user2957945

回答

2

我們可以expand.grid做相結合,找到列的所有組合1:3,然後依次通過行,子集的數據集,並得到這些

nm1 <- names(df1)[1:3] 
apply(expand.grid(nm1, nm1), 1, FUN = function(x) Reduce(`*`, df1[x])) 

*以上輸出給所有的組合,但如果假設我們要刪除是鏡像

#expand the names to two columns with each combination 
d1 <- expand.grid(nm1, nm1) 
#remove the rows that are duplicates 
d2 <- d1[!duplicated(t(apply(d1, 1, sort))),] 
#apply the function and change the column names 
d3 <- apply(d2, 1, FUN = function(x) Reduce(`*`, df1[x])) 
colnames(d3) <- do.call(paste0, d2) 

及其組合,如果需要cbind與所述第一3列

cbind(df1[1:3], d3) 

另一種選擇是combn

d1 <- as.data.frame(combn(nm1, 2, FUN = function(x) Reduce(`*`, df1[x]))) 
nm2 <- combn(nm1, 2, FUN = paste, collapse="") 
names(d1) <- nm2 
d2 <- setNames(as.data.frame(df1[1:3]^2), paste0(nm1, nm1)) 
cbind(df1[1:3], d1, d2) 
0

你也不要這樣相當的基礎R矢量:

# Data 
m <- matrix(1:12,4,3) 

cl <- ncol(m) 
res <- cbind(m, m[,rep(seq(cl), cl:1)] * m[,unlist(Map(":", 1:cl, rep(cl,cl)))]) 

     # [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] 
# [1,] 1 5 9 1 5 9 25 45 81 
# [2,] 2 6 10 4 12 20 36 60 100 
# [3,] 3 7 11 9 21 33 49 77 121 
# [4,] 4 8 12 16 32 48 64 96 144 

基本上,你首先選擇您想擁有的列產品,然後一次完成。