在R语言中实现给定数值的2的幂组合二进制矩阵输出
R语言:将组合值分解为2的幂并生成二进制矩阵
需求说明
现有两个数据框:
- 数据框1:包含20到231的所有幂值(1、2、4…2147483648)
- 数据框2:包含待分解的组合值(如20、50)
需要将每个组合值分解为2的幂之和,生成一个二进制矩阵:每一行对应一个组合值,每一列对应一个2的幂,若组合值包含该幂则标记1,否则标记0。
完整实现代码
基础版本(处理常规整数,若需支持2^31则看进阶版本)
# 1. 生成数据框1:包含2^0到2^31的幂值及对应指数 pow2_values <- 2^(0:31) pow2_df <- data.frame( power_value = pow2_values, exponent = 0:31 ) # 2. 示例数据框2(替换为你的实际数据) comb_df <- data.frame(combination = c(20, 50)) # 3. 定义分解函数:用位运算判断每个2的幂是否属于组合值的组成部分 decompose_to_pow2 <- function(x, pow2_vec) { # 位运算x & pow2_vec:若结果非0,说明该幂是x的组成部分 as.integer((x & pow2_vec) != 0) } # 4. 批量处理生成二进制矩阵 result_matrix <- t(sapply(comb_df$combination, decompose_to_pow2, pow2_vec = pow2_values)) # 5. 转换为数据框并设置列名 result_df <- as.data.frame(result_matrix) colnames(result_df) <- paste0("2^", 0:31) # 6. 合并原组合值与结果(可选,方便对应查看) final_result <- cbind(comb_df, result_df) # 查看结果(仅展示前7列示例) head(final_result[, 1:7])
进阶版本(支持2^31,避免整数溢出)
由于231(2147483648)超出了R默认32位整数的范围(最大值为231-1),如果你的组合值包含2^31,需要用bit64包处理64位整数:
library(bit64) # 1. 生成64位整数类型的2的幂 pow2_values <- as.integer64(2)^(0:31) pow2_df <- data.frame( power_value = pow2_values, exponent = 0:31 ) # 2. 将数据框2的组合值转为64位整数 comb_df <- data.frame(combination = as.integer64(c(20, 50, 2147483648))) # 3. 适配64位整数的分解函数 decompose_to_pow2 <- function(x, pow2_vec) { as.integer((bitwAnd(x, pow2_vec)) != 0) } # 后续步骤同基础版本 result_matrix <- t(sapply(comb_df$combination, decompose_to_pow2, pow2_vec = pow2_values)) result_df <- as.data.frame(result_matrix) colnames(result_df) <- paste0("2^", 0:31) final_result <- cbind(comb_df, result_df)
代码说明
- 位运算效率:使用
x & pow2_vec是判断2的幂组成的最高效方式,比循环取余/除法快得多,尤其适合处理大量数据。 - 列命名:用
paste0("2^", 0:31)直接生成对应幂的列名,清晰直观。 - 64位整数处理:当需要支持2^31时,
bit64包的integer64类型可以避免整数溢出问题,bitwAnd是64位整数的位与运算函数。
内容的提问来源于stack exchange,提问作者Rajesh Addunuri
相关产品推荐
相关产品推荐

