通过复制长度大于1的元素来解压缩列表

时间:2018-07-11 00:48:10

标签: r

我有以下列表,希望仅使用 R 打开(也称为展开)。

例如,我要打开它:

b <- list(a = c(1, 2), b = 1, d = c(5, 7))

等价于:

list(a = 1, a = 2, b = 1, d = 5, d = 7)

如果只有一个命名元素的长度大于1,但如果有多个元素,则没有此功能,我可以使用此功能:

expand_list <- function(listx){
  long_elements <- as.numeric(which(lapply(listx, length) > 1))
  short_elements <- as.numeric(which(lapply(listx, length) == 1))

  res <- lapply(long_elements, function(x){
    as.list(setNames(listx[[x]], rep(names(listx)[x], length(listx[[x]]))))
  }) 

  expanded_elements <- res[[1]]
  c(listx[short_elements], expanded_elements)
}

expand_list(b)

1 个答案:

答案 0 :(得分:3)

您可以使用stack后跟setNames来实现

y <- list(a = c(1, 2), b = 1, c = 2, d = c(5, 7))
x <- stack(y)
as.list(setNames(x$values, x$ind))