我有一个包含两个矩阵的列表:
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")
,但肯定有比这更简单的方法(?)
答案 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
之所以会这样,是因为m1
和m2
是长度相同的向量(因为它们是矩阵),并且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