在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
请问这段代码的实现是否正确?
解答
你的代码实现完全正确,完全满足需求:
- 第一列
col1准确提取了矩阵的所有行名,生成了10行数据,符合要求; - 第二列
col2通过apply按行遍历矩阵,筛选出每行非零元素对应的列名,并用,拼接成字符串,结果和矩阵的非零元素位置完全匹配(比如aaa行的非零列是222、666、888、999、101010,代码输出的col2内容完全对应)。
你给出的示例结果里aaa行漏写了101010,这是示例的错误,不是代码的问题。
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

