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是交叉乘积,比率是我想要做的两列的比率作为矩阵计算,所以它很快而不是循环
我还是 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% 左右!