r - 二进制矩阵的字符串列表
问题描述
我想基于字符串列表创建一个二进制矩阵。
dt = data.table(id = c('id1','id2','id3','id4','id5','id6'), sample = c("MER-1,MER-3,MER-4","MER-5","MER-2","MER-2,MER-3,MER-4,MER-5","MER_3","MER-5" ))
dt
id sample
1: id1 MER-1,MER-3,MER-4
2: id2 MER-5
3: id3 MER-2
4: id4 MER-2,MER-3,MER-4,MER-5
5: id5 MER_3
6: id6 MER-5
应该导致类似:
m_count = matrix(c(1,0,1,1,0, 0,0,0,0,1, 0,1,0,0,0, 0,1,1,1,1, 0,0,1,0,0, 0,0,0,0,1), nrow = 6, ncol = 5)
m_count
MER-1 MER-2 MER-3 MER-4 MER-5
id1 1 0 0 1 0
id2 0 0 0 1 0
id3 1 0 0 0 0
id4 1 1 0 0 0
id5 0 0 1 1 0
id6 0 1 1 0 1
我可以遍历列表的每个元素,并填充矩阵,但考虑到我的表的大小会非常慢。有没有更快/更优雅的方法?也许与 dplyr/tidyverse ?谢谢!
解决方案
使用dt
末尾的注释修复了问题中的错字,用于separate_rows
逐行扩展数据,然后用于table
计算计数。
library(data.table)
library(dplyr)
library(tidyr)
dt %>%
separate_rows(sample, sep = ",") %>%
table
给予:
sample
id MER-1 MER-2 MER-3 MER-4 MER-5
id1 1 0 1 1 0
id2 0 0 0 0 1
id3 0 1 0 0 0
id4 0 1 1 1 1
id5 0 0 1 0 0
id6 0 0 0 0 1
笔记
library(data.table)
dt <- data.table(id = c('id1','id2','id3','id4','id5','id6'),
sample = c("MER-1,MER-3,MER-4","MER-5","MER-2","MER-2,MER-3,MER-4,MER-5","MER-3","MER-5" ))