如何将向量列表拆分为列或矩阵?

How to split a list of vectors into columns or matrix?

我有一个采用这种形式的向量列表:

> g
[[1]]
 [1] "L"  "14" "L"  "39" "L"  "61" "B"  "0"  "L"  "15" "L"  "59" "W"  "64"

[[2]]
[1] "L"  "62" "D"  "31" "L"  "10" "L"  "30" "B"  "0"  "D"  "45" "L"  "43"

[[3]]
 [1] "H"  "0"  "L"  "11" "L"  "35" "W"  "45" "H"  "0"  "L"  "40" "L"  "42"

我的目标是在这个结构上使用 mapply 并将 14 列中的每一列都变成一个向量。第一列为:

[[1]]
[1] "L"

[[2]]
[1] "L"

[[3]]
[1] "H"

第二列是:

[[1]]
[1] "14"

[[2]]
[1] "62"

[[3]]
[1] "0"

等等。我怀疑该结构将是一个矩阵(?),但我不确定。我使用了很多 lapplystringrstr_extract_all 和正则表达式来得到这一点,但我不确定如何继续。我怀疑该函数会使用如下模式:"[A-Z]{1}" 用于文本和 "[:digit:]{1}" 我知道 mapply 可以 return 矩阵但我不知道从哪里开始.

这里有一个使用 mapply 的解决方案

g <- list()
g[[1]] <- c("L",  "14", "L",  "39", "L",  "61", "B",  "0",  "L",  "15", "L",  "59", "W",  "64")
g[[2]] <- c("L",  "62", "D",  "31", "L",  "10", "L",  "30", "B",  "0",  "D",  "45", "L",  "43")
g[[3]] <- c("H",  "0",  "L",  "11", "L",  "35", "W",  "45", "H",  "0",  "L",  "40", "L",  "42")

考虑在每个列表元素中提取第一个元素的简单情况,您可以使用 lapply:

lapply(g, function (x) x[1])

现在我们可以使用mapply进行迭代了:

lengths(g) # returns length of each element in the list
g2 <- mapply(function(y) lapply(g, function (x) x[y]), 1:lengths(g)[1])
g2

#      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14]
# [1,] "L"  "14" "L"  "39" "L"  "61" "B"  "0"  "L"  "15"  "L"   "59"  "W"   "64" 
# [2,] "L"  "62" "D"  "31" "L"  "10" "L"  "30" "B"  "0"   "D"   "45"  "L"   "43" 
# [3,] "H"  "0"  "L"  "11" "L"  "35" "W"  "45" "H"  "0"   "L"   "40"  "L"   "42" 

g2[,1]
# [[1]]
# [1] "L"

# [[2]]
# [1] "L"

# [[3]]
# [1] "H"

unlist(g2[,1])
# [1] "L" "L" "H"

作为 do.call(rbind, g) 的替代方案,我们可以利用一个事实,即 data.frame 实际上是一个向量列表,其中所有向量都具有相同的长度。因此,给定的结构 g 可以转换为 data.frame,然后根据要求转置产生矩阵。

转载数据:

g <- list(
  c("L",  "14", "L",  "39", "L",  "61", "B",  "0",  "L",  "15", "L",  "59", "W",  "64"),
  c("L",  "62", "D",  "31", "L",  "10", "L",  "30", "B",  "0",  "D",  "45", "L",  "43"),
  c("H",  "0",  "L",  "11", "L",  "35", "W",  "45", "H",  "0",  "L",  "40", "L",  "42")
)

变换:

m <- t(as.data.frame(g))
dimnames(m) <- NULL   # remove deafault row names
m
#     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14]
#[1,] "L"  "14" "L"  "39" "L"  "61" "B"  "0"  "L"  "15"  "L"   "59"  "W"   "64" 
#[2,] "L"  "62" "D"  "31" "L"  "10" "L"  "30" "B"  "0"   "D"   "45"  "L"   "43" 
#[3,] "H"  "0"  "L"  "11" "L"  "35" "W"  "45" "H"  "0"   "L"   "40"  "L"   "42"

访问列:

m[, 1]
#[1] "L" "L" "H"