如何进行矩阵计算以获得变量的叉积

she*_*ode 5 r matrix matrix-multiplication

我在R中有一些数据有很多列.请使用以下作为示例

x = replicate(5, rnorm(10)) 
colnames(x) = c('a','b','c','d','e')
Run Code Online (Sandbox Code Playgroud)

我想计算每种组合的交叉乘积和比率,并将它们添加到表的末尾.我也想给它们命名,以便它们与计算的内容相关

结果应该有exta列,如:

cp_a_b,
cp_a_c,
cp_a_d,
cp_a_e,
cp_b_c,
cp_b_d,
cp_b_e,
cp_c_d,
cp_c_e,
cp_d_e,
ratio_a_b,
ratio_a_c,
ratio_a_d,
ratio_a_e,
ratio_b_c,
ratio_b_d,
ratio_b_e,
ratio_c_d,
ratio_c_e,
ratio_d_e,
Run Code Online (Sandbox Code Playgroud)

其中cp是交叉乘积,比率是我想要做的两列的比率作为矩阵计算,所以它很快而不是循环

Whi*_*ing 4

我还是 R 新手,但无论如何还是要尝试一下。为了娱乐!我不知道是否有希望能够很快。大概是太天真了吧……

x首先是小随机整数的示例矩阵num_observations x num_features

num_features <- 5
num_observations <- 20
features <- letters[1:num_features]

x <- replicate(num_features, sample(1:10, num_observations, replace = T))

colnames(x) <- features
Run Code Online (Sandbox Code Playgroud)

特征对的所有组合:

combinations <- combn(features, 2)
num_combinations = ncol(combinations)
Run Code Online (Sandbox Code Playgroud)

对于每个特征对,我们将乘以 中的相应列x。为新矩阵保留空间,其中相乘的列将结束:

y <- matrix(NA, ncol = num_combinations, nrow = num_observations)
cn <- rep("?", num_combinations) # column names of new features
Run Code Online (Sandbox Code Playgroud)

将列组合相乘:

for (i in 1:num_combinations)
{
  cn[i] <- paste(combinations[1,i], combinations[2,i], sep = ".")
  y[,i] <- x[,combinations[1,i]] * x[,combinations[2,i]]
}
colnames(y) <- cn
Run Code Online (Sandbox Code Playgroud)

最后合并原始矩阵和附加特征:

x <- cbind(x, y)
Run Code Online (Sandbox Code Playgroud)

为了简单起见,这仅处理乘法,使用除法创建的附加功能当然是类似的。

更新

@nongkrong 在评论中建议的一个好方法放弃了显式循环,只需执行以下操作:

y <- combn(split(x, col(x)), 2, FUN = function(cols) cols[[1]] * cols[[2]])
x <- cbind(x, y)
Run Code Online (Sandbox Code Playgroud)

它没有显式设置新功能的列名,但更优雅、更具可读性。在我做的一些快速计时中,速度也快了 30% 左右!