如何将向量列表拆分为列或矩阵?
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"
等等。我怀疑该结构将是一个矩阵(?),但我不确定。我使用了很多 lapply
和 stringr
的 str_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"
我有一个采用这种形式的向量列表:
> 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"
等等。我怀疑该结构将是一个矩阵(?),但我不确定。我使用了很多 lapply
和 stringr
的 str_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"