You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在R语言中从矩阵提取非零元素对应列名并生成数据框

你的R代码实现是否正确?

我正在用R开发,创建了如下0-1矩阵:

set.seed(123)
mat <- matrix(sample(0:1, 100, replace = TRUE), nrow = 10, ncol = 10, 
              dimnames = list(c('aaa', 'bbb', 'ccc', 'ddd', 'eee', 'fff', 'ggg', 'hhh', 'iii', 'jjj'), 
                              c('111', '222', '333', '444', '555', '666', '777', '888', '999', '101010')))
mat

矩阵输出结果:

> mat
    111 222 333 444 555 666 777 888 999 101010
aaa   0   1   0   0   0   1   0   1   1      1
bbb   0   1   1   1   1   0   1   0   1      1
ccc   0   1   0   0   1   0   1   0   0      0
ddd   1   0   0   1   0   0   0   0   1      1
eee   0   1   0   1   0   0   0   0   1      1
fff   1   0   0   0   0   1   1   1   1      0
ggg   1   1   1   0   0   1   0   1   0      0
hhh   1   0   1   0   1   0   0   0   0      1
iii   0   0   0   0   0   1   0   1   1      0
jjj   0   0   1   1   0   0   0   1   0      0

我的需求是生成一个2列10行的dataframe:

  • 第一列是矩阵的行名(aaa、bbb、ccc等)
  • 第二列是该行中非零元素对应的矩阵列名

示例结果如下:

col1                             col2
1  aaa                222, 666, 888,999
2  bbb 222,333,444,555, 777,999, 101010

structure(list(col1 = c("aaa", "bbb"), col2 = c("222, 666, 888,999", 
"222,333,444,555, 777,999, 101010")), class = "data.frame", row.names = c(NA, 
-2L))

我尝试了以下代码:

df <- data.frame(col1 = rownames(mat), 
                 col2 = apply(mat, 1, function(x) paste0(colnames(mat)[which(x != 0)], collapse = ", ")))

输出结果:

col1                                 col2
aaa  aaa           222, 666, 888, 999, 101010
bbb  bbb 222, 333, 444, 555, 777, 999, 101010
ccc  ccc                        222, 555, 777
ddd  ddd                111, 444, 999, 101010
eee  eee                222, 444, 999, 101010
fff  fff              111, 666, 777, 888, 999
ggg  ggg              111, 222, 333, 666, 888
hhh  hhh                111, 333, 555, 101010
iii  iii                        666, 888, 999
jjj  jjj                        333, 444, 888

请问这段代码的实现是否正确?


解答

你的代码实现完全正确,完全满足需求:

  1. 第一列col1准确提取了矩阵的所有行名,生成了10行数据,符合要求;
  2. 第二列col2通过apply按行遍历矩阵,筛选出每行非零元素对应的列名,并用, 拼接成字符串,结果和矩阵的非零元素位置完全匹配(比如aaa行的非零列是222、666、888、999、101010,代码输出的col2内容完全对应)。

你给出的示例结果里aaa行漏写了101010,这是示例的错误,不是代码的问题。

内容的提问来源于stack exchange,提问作者stats_noob

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 14:37:32