我有一个免费大小的矢量列表

set.seed(1)
dat <- lapply(1:10, \(x) sample(letters, size = sample(1:10,1), replace = T))

dat

[[1]]
[1] "d" "g" "a" "b" "w" "k" "n" "r" "s"

[[2]]
[1] "u"

[[3]]
[1] "j" "v" "n" "j" "g"

[[4]]
[1] "o" "u" "e" "i" "y" "n" "e" "e" "b"

[[5]]
 [1] "y" "l" "o" "a" "t" "c" "f" "j" "j" "f"

有什么方法可以使矩阵像这样密集,但效率更高? 另外,我还想保存列名,如本例所示

library(arules)
as(transactions(dat), "matrix")


          a     b     c     d     e     f     g     h     i     j     k     l     m
 [1,]  TRUE  TRUE FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE FALSE  TRUE FALSE FALSE
 [2,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [3,] FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE FALSE
 [4,] FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE
 [5,]  TRUE FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE FALSE  TRUE FALSE  TRUE FALSE
 [6,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE
 [7,] FALSE FALSE FALSE FALSE FALSE  TRUE FALSE  TRUE FALSE FALSE FALSE  TRUE FALSE
 [8,] FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE FALSE FALSE  TRUE FALSE FALSE FALSE
 [9,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE
[10,]  TRUE FALSE FALSE FALSE FALSE  TRUE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE
          n     o     r     s     t     u     v     w     x     y     z
 [1,]  TRUE FALSE  TRUE  TRUE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE
 [2,] FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE
 [3,]  TRUE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE
 [4,]  TRUE  TRUE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE  TRUE FALSE
 [5,] FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE  TRUE FALSE
 [6,] FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE  TRUE  TRUE
 [7,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE FALSE
 [8,] FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE  TRUE FALSE  TRUE
 [9,] FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[10,]  TRUE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

这是а规则包中的一个示例,并未针对我的目的进行优化

推荐答案

与优秀的@ThomasIsCoding解决方案相比,速度略快,内存效率更高:

mdummy <- function(dat) {
  n <- length(dat)
  vec <- as.factor(unlist(dat, FALSE, FALSE))
  lvls <- levels(vec)
  out <- matrix(FALSE, nrow = n, ncol = length(lvls), dimnames = list(NULL, lvls))
  out[cbind(rep(seq_len(n), lengths(dat)), as.integer(vec))] <- TRUE
  out
}

包含100个向量的快速基准测试:

set.seed(1)
dat <- lapply(1:100, \(x) sample(letters, size = sample(1:10,1), replace = T))

bench::mark(
  table(rep(seq_along(dat), lengths(dat)), unlist(dat)) > 0,
  mdummy(dat),
  check = FALSE
)

# expression        min median `itr/sec` mem_alloc `gc/sec` n_itr  n_gc total_time result
#   1 table()     232µs  267µs     3331.     111KB     8.46  1576     4      473ms <NULL>
#   2 mdummy(dat) 100µs  118µs     7104.    45.2KB     6.32  3373     3      475ms <NULL>

R相关问答推荐

为什么以及如何修复Mapview不显示所有点并且st_buffer合并一些区域R?

单击 map 后,将坐标复制到剪贴板

如何 bootstrap glm回归、估计95%置信区间并绘制它?

从开始时间和结束时间导出时间

删除列表中存储的数据帧内和数据帧之间的重复行

单个轮廓重叠条的单独图例

绘制采样开始和采样结束之间的事件

如何在科学记数法中显示因子

R -在先前group_by级别汇总时获取最大大小子组的计数

为R中的16组参数生成10000个样本的有效方法是什么?

用多边形替换地块点

如何预测原始数据集并将值添加到原始数据集中

有没有办法将基于每个值中出现的两个关键字或短语的字符串向量重新编码为具有这两个值的新向量?

按两个因素将观测值分组后计算单独的百分比

使用geom_sf跨越日期线时的闭合边界

在生成打印的自定义函数中,可以通过变量将线型或 colored颜色 设置为NULL吗?

如何根据其他列中的两个条件来计算数据帧中的行之间的差异?

将每晚的平均值与每晚的值进行比较,统计是否有效?

reshape 数据帧-基于组将行转换为列

R data.设置函数&;连接中的列值而不使用for循环的表方法?