在R语言中将频率向量转换为逻辑矩阵的实现方法求助
解决思路与实现代码
没问题,这个需求其实很好实现,核心思路就是先根据频率生成对应列的索引序列,再把这个序列转换成每行仅一个激活项的逻辑矩阵。
具体实现步骤
- 第一步:先计算总观测数(也就是所有频率的总和),然后生成一个列索引向量——每个列的索引会被重复对应次数(比如你的示例
s=c(1,2,3),就会生成c(1,2,2,3,3,3)) - 第二步:初始化一个全为
FALSE的矩阵,行数等于总观测数,列数等于原频率向量的长度 - 第三步:根据索引向量,把矩阵中对应位置设为
TRUE,这样每行就只有一个TRUE,列和正好等于原频率向量的值
完整代码示例
# 定义转换函数 freq_to_logical_matrix <- function(freq_vec) { # 生成重复的列索引 col_positions <- rep(seq_along(freq_vec), times = freq_vec) # 初始化空逻辑矩阵 result_mat <- matrix(FALSE, nrow = length(col_positions), ncol = length(freq_vec)) # 填充对应位置为TRUE result_mat[cbind(seq_along(col_positions), col_positions)] <- TRUE # 可选:随机打乱行顺序(题目说行序无关,这一步非必需) # result_mat <- result_mat[sample(nrow(result_mat)), ] return(result_mat) } # 测试示例 s <- c(1,2,3) output <- freq_to_logical_matrix(s) print(output)
运行这段代码后,你会得到和示例逻辑一致的输出(如果没开随机打乱,行顺序是固定的;开了的话行序会随机,但列和始终是s的值):
[,1] [,2] [,3] [1,] TRUE FALSE FALSE [2,] FALSE TRUE FALSE [3,] FALSE TRUE FALSE [4,] FALSE FALSE TRUE [5,] FALSE FALSE TRUE [6,] FALSE FALSE TRUE
额外说明
如果想要矩阵里用0和1而不是逻辑值(TRUE/FALSE),只需要把初始化矩阵的FALSE改成0,然后赋值时设为1就行,代码调整起来非常简单~
内容的提问来源于stack exchange,提问作者Suzanne
相关产品推荐
相关产品推荐

