将长度不同的向量列表R转换为矩阵

5

我有以下列表,我想将其转换为矩阵M:

L<-list(c(2L, 29L, 30L), c(1L, 3L, 30L, 31L), c(2L, 31L, 32L), c(5L, 
60L), c(4L, 6L, 60L, 61L), c(5L, 7L, 61L, 62L))

[[1]]
[1]  2 29 30

[[2]]
[1]  1  3 30 31

[[3]]
[1]  2 31 32

[[4]]
[1]  5 60

[[5]]
[1]  4  6 60 61

[[6]]
[1]  5  7 61 62

Matrix M:

2 29 30 NA
1 3 30 31
2 31 32 NA
5 60 NA NA
4 6 60 61
5 7 61 62

我希望每个列表成为矩阵的一行,并用NA填充任何缺失的值。
4个回答

3

基于使用length<-将列表元素的最大长度确定,然后在每个list元素末尾附加NA,最后使用rbinddo.call函数。

mx <- max(lengths(L))
do.call(rbind, lapply(L, `length<-`, mx))

-输出

    [,1] [,2] [,3] [,4]
[1,]    2   29   30   NA
[2,]    1    3   30   31
[3,]    2   31   32   NA
[4,]    5   60   NA   NA
[5,]    4    6   60   61
[6,]    5    7   61   62

1
有更好的方法,但这个也能行: ```

有更好的方法,但这个也能行:

```
L<-list(c(2L, 29L, 30L), c(1L, 3L, 30L, 31L), c(2L, 31L, 32L), c(5L, 
60L), c(4L, 6L, 60L, 61L), c(5L, 7L, 61L, 62L))

out <- matrix(nrow=6, ncol=4)
for(i in 1:length(L)) {
  out[i, ] <- c(L[[i]], rep(NA, (4-length(L[[i]]))))
}

out

#      [,1] [,2] [,3] [,4]
# [1,]    2   29   30   NA
# [2,]    1    3   30   31
# [3,]    2   31   32   NA
# [4,]    5   60   NA   NA
# [5,]    4    6   60   61
# [6,]    5    7   61   62

1
您还可以使用来自stringi包的stri_list2matrix函数。这将把列表向量转换为字符矩阵,如果需要,您应该像这样将其转换为数字:
L<-list(c(2L, 29L, 30L), c(1L, 3L, 30L, 31L), c(2L, 31L, 32L), c(5L, 
                                                                 60L), c(4L, 6L, 60L, 61L), c(5L, 7L, 61L, 62L))


library(stringi)
m <- stri_list2matrix(L, byrow=TRUE)
class(m) <- "numeric"
m
#>      [,1] [,2] [,3] [,4]
#> [1,]    2   29   30   NA
#> [2,]    1    3   30   31
#> [3,]    2   31   32   NA
#> [4,]    5   60   NA   NA
#> [5,]    4    6   60   61
#> [6,]    5    7   61   62

本示例由 reprex软件包 (v2.0.1)于2022-07-29生成。


1

另一种可能的解决方案是基于 purrr::map_dfr

library(tidyverse)

map_dfr(L, ~ .x %>% set_names(LETTERS[1:length(.x)])) %>% 
  as.matrix %>% unname

#>      [,1] [,2] [,3] [,4]
#> [1,]    2   29   30   NA
#> [2,]    1    3   30   31
#> [3,]    2   31   32   NA
#> [4,]    5   60   NA   NA
#> [5,]    4    6   60   61
#> [6,]    5    7   61   62

更简单地说:
tibble(L) %>% unnest_wider(L) %>% suppressMessages %>% as.matrix %>% unname

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接