连接嵌套列表并添加列

时间:2018-11-08 11:28:39

标签: r dplyr

我有一个包含两个矩阵的列表:

a <- list("m1"=matrix(1:9, nrow = 3, ncol = 3),
          "m2"=matrix(1:9, nrow = 3, ncol = 3))

我想绑定两个矩阵(行绑定),并区分行,我想添加一个包含矩阵名称的列。我可以使用r bind绑定行:

b <- do.call(rbind, a) %>% as.data.frame

产生

  V1 V2 V3
1  1  4  7
2  2  5  8
3  3  6  9
4  1  4  7
5  2  5  8
6  3  6  9

但是如何添加包含名称的列?我可以做b$id <- c("m1","m1","m1","m2","m2","m2"),但肯定有比这更简单的方法(?)

2 个答案:

答案 0 :(得分:2)

这是在dplyr / purrr中进行的操作

a %>% purrr::map(as.data.frame) %>% dplyr::bind_rows(.id = "origin")
  origin V1 V2 V3
1     m1  1  4  7
2     m1  2  5  8
3     m1  3  6  9
4     m2  1  4  7
5     m2  2  5  8
6     m2  3  6  9

在将行进行行绑定之前将其转换为数据帧。

您可以在矩阵列表上使用bind_rows。但是它不会返回您的期望。

a %>% bind_rows(.id = "origin")
# A tibble: 9 x 3
  origin    m1    m2
  <chr>  <int> <int>
1 1          1     1
2 1          2     2
3 1          3     3
4 1          4     4
5 1          5     5
6 1          6     6
7 1          7     7
8 1          8     8
9 1          9     9

之所以会这样,是因为m1m2是长度相同的向量(因为它们是矩阵),并且bind_rows将恒定长度向量的列表视为单个数据帧。因此,后者的调用等效于

bind_rows(data.frame(m1 = as.vector(m1), m2 = as.vector(m2)), .id = "origin")

因此,在将它们绑定在一起之前,请确保将矩阵转换为data.frames。

答案 1 :(得分:1)

您可以这样做:

b <- do.call(rbind.data.frame, a)

#     V1 V2 V3
#m1.1  1  4  7
#m1.2  2  5  8
#m1.3  3  6  9
#m2.1  1  4  7
#m2.2  2  5  8
#m2.3  3  6  9

或者如果您对此不满意,

b    <- do.call(rbind.data.frame, a)
b$id <- sub("[.].+", "", rownames(b))

#     V1 V2 V3 id
#m1.1  1  4  7 m1
#m1.2  2  5  8 m1
#m1.3  3  6  9 m1
#m2.1  1  4  7 m2
#m2.2  2  5  8 m2
#m2.3  3  6  9 m2