R语言:如何按行查找矩阵中值为1的列号或列名
嘿,我明白你的问题啦!你现在需要在每行里定位值为1的列位置(列号或列名),之前的代码返回行号是因为逻辑方向错了——你用any(x == 1)只是判断每行有没有1,which自然就返回存在1的行号啦。下面给你几个适配你场景(每行1-64无重复,所以每行肯定只有一个1)的解决方案:
方法一:用apply直接按行提取位置
这个方法直观,适合新手理解:
# 假设你的矩阵名叫my_matrix # 获取每行中1对应的列号 col_numbers <- apply(my_matrix, 1, function(x) which(x == 1)) # 如果需要列名,先确保矩阵有列名(没有的话先设置) # 先给矩阵加列名(可选,根据你的需求) colnames(my_matrix) <- paste0("Column_", 1:64) # 提取对应列名 col_names <- apply(my_matrix, 1, function(x) colnames(my_matrix)[which(x == 1)])
因为你的每行里1只出现一次,所以which(x ==1)会直接返回单个数字,结果会是一个长度17000的向量,每个元素对应每行的列号/列名。
方法二:用矩阵索引直接定位(更高效)
如果你的矩阵很大,这种方法比apply更快(因为apply本质是循环,而矩阵索引是向量化操作):
# 先找到矩阵中所有等于1的位置的线性索引 linear_indices <- which(my_matrix == 1) # 把线性索引转换成列号 col_numbers <- (linear_indices - 1) %% ncol(my_matrix) + 1 # 同样,要列名的话直接用列号索引 col_names <- colnames(my_matrix)[col_numbers]
原理是R的矩阵是按列存储的,所以线性索引转列号的公式就是(索引-1) %% 列数 +1,这个计算非常快,适合处理大矩阵。
测试小例子验证
给你个小矩阵测试下效果,确保没问题:
# 构造测试矩阵 test_mat <- matrix(c(5,1,3, 2,4,1), nrow=3, ncol=2, dimnames=list(NULL, c("ColX", "ColY"))) # 用方法一提取列号 apply(test_mat, 1, function(x) which(x==1)) # 输出:2 1 2 # 提取列名 apply(test_mat, 1, function(x) colnames(test_mat)[which(x==1)]) # 输出:"ColY" "ColX" "ColY"
这样就能完美得到你想要的结果啦!
内容的提问来源于stack exchange,提问作者M164584
相关产品推荐
相关产品推荐

