在 purrr 中按条件合并列表中的数据帧
Merge data frames in a list by condition in purrr
我有一个具有以下结构的数据框列表:
list_example <- list(type1_a_b = data.frame(id = 1:3, a = 1:3, b = 4:6),
type1_c_d = data.frame(id = 1:5, c = 1:5, d = 5:9),
type2_e_f = data.frame(id = c(1,3,4), e = 1:3, f = 4:6),
type2_g_h = data.frame(id = c(2,3,4), g = 1:3, h = 5:7))
我还有一个数据帧类型向量:
data_types <- c("type1", "type2")
我想按类型完全连接数据帧(使用 data_types 向量和 id 列),最好使用 purrr
.
期望输出:
list(type1 = data.frame(id = 1:5,
a = c(1:3, NA, NA),
b = c(4:6, NA, NA),
c = 1:5,
d = 5:9),
type2 = data.frame(id = c(1:4),
e = c(1, NA, 3, 4),
f = c(4, NA, 5, 6),
g = c(NA, 1:3),
h = c(NA, 5:7))
)
$type1
id a b c d
1 1 1 4 1 5
2 2 2 5 2 6
3 3 3 6 3 7
4 4 NA NA 4 8
5 5 NA NA 5 9
$type2
id e f g h
1 1 1 4 NA NA
2 2 NA NA 1 5
3 3 3 5 2 6
4 4 4 6 3 7
我能够使用 this post 的解决方案将所有列表元素缩减为一个数据框,但我希望以列表格式输出以便以后分别处理不同的数据类型。
list_example %>%
purrr::reduce(full_join, by = "id")
id a b c d e f g h
1 1 1 4 1 5 1 4 NA NA
2 2 2 5 2 6 NA NA 1 5
3 3 3 6 3 7 2 5 2 6
4 4 NA NA 4 8 3 6 3 7
5 5 NA NA 5 9 NA NA NA NA
谢谢!
我们可以 split
名称的子串,并用 map
循环外部 list
和 reduce
内部嵌套 list
full_join
library(dplyr)
library(stringr)
library(purrr)
list_example %>%
split(str_remove(names(.), "_.*")) %>%
map(~ reduce(.x, full_join, by = "id") %>%
arrange(id))
-输出
$type1
id a b c d
1 1 1 4 1 5
2 2 2 5 2 6
3 3 3 6 3 7
4 4 NA NA 4 8
5 5 NA NA 5 9
$type2
id e f g h
1 1 1 4 NA NA
2 2 NA NA 1 5
3 3 2 5 2 6
4 4 3 6 3 7
或在base R
中使用merge/Reduce
lapply(split(list_example, sub("_.*", "", names(list_example))),
\(x) Reduce(\(...) merge(..., all = TRUE), x))
-输出
$type1
id a b c d
1 1 1 4 1 5
2 2 2 5 2 6
3 3 3 6 3 7
4 4 NA NA 4 8
5 5 NA NA 5 9
$type2
id e f g h
1 1 1 4 NA NA
2 2 NA NA 1 5
3 3 2 5 2 6
4 4 3 6 3 7
使用 lapply
-
的基础 R 选项
nm <- names(list_example)
result <- lapply(data_types, function(x)
Reduce(function(p, q) merge(p, q, all = TRUE, by = 'id'),
list_example[grep(x, nm)]))
result
#[[1]]
# id a b c d
#1 1 1 4 1 5
#2 2 2 5 2 6
#3 3 3 6 3 7
#4 4 NA NA 4 8
#5 5 NA NA 5 9
#[[2]]
# id e f g h
#1 1 1 4 NA NA
#2 2 NA NA 1 5
#3 3 2 5 2 6
#4 4 3 6 3 7
如果要命名result
列表,可以添加。
names(result) <- data_types
我有一个具有以下结构的数据框列表:
list_example <- list(type1_a_b = data.frame(id = 1:3, a = 1:3, b = 4:6),
type1_c_d = data.frame(id = 1:5, c = 1:5, d = 5:9),
type2_e_f = data.frame(id = c(1,3,4), e = 1:3, f = 4:6),
type2_g_h = data.frame(id = c(2,3,4), g = 1:3, h = 5:7))
我还有一个数据帧类型向量:
data_types <- c("type1", "type2")
我想按类型完全连接数据帧(使用 data_types 向量和 id 列),最好使用 purrr
.
期望输出:
list(type1 = data.frame(id = 1:5,
a = c(1:3, NA, NA),
b = c(4:6, NA, NA),
c = 1:5,
d = 5:9),
type2 = data.frame(id = c(1:4),
e = c(1, NA, 3, 4),
f = c(4, NA, 5, 6),
g = c(NA, 1:3),
h = c(NA, 5:7))
)
$type1
id a b c d
1 1 1 4 1 5
2 2 2 5 2 6
3 3 3 6 3 7
4 4 NA NA 4 8
5 5 NA NA 5 9
$type2
id e f g h
1 1 1 4 NA NA
2 2 NA NA 1 5
3 3 3 5 2 6
4 4 4 6 3 7
我能够使用 this post 的解决方案将所有列表元素缩减为一个数据框,但我希望以列表格式输出以便以后分别处理不同的数据类型。
list_example %>%
purrr::reduce(full_join, by = "id")
id a b c d e f g h
1 1 1 4 1 5 1 4 NA NA
2 2 2 5 2 6 NA NA 1 5
3 3 3 6 3 7 2 5 2 6
4 4 NA NA 4 8 3 6 3 7
5 5 NA NA 5 9 NA NA NA NA
谢谢!
我们可以 split
名称的子串,并用 map
循环外部 list
和 reduce
内部嵌套 list
full_join
library(dplyr)
library(stringr)
library(purrr)
list_example %>%
split(str_remove(names(.), "_.*")) %>%
map(~ reduce(.x, full_join, by = "id") %>%
arrange(id))
-输出
$type1
id a b c d
1 1 1 4 1 5
2 2 2 5 2 6
3 3 3 6 3 7
4 4 NA NA 4 8
5 5 NA NA 5 9
$type2
id e f g h
1 1 1 4 NA NA
2 2 NA NA 1 5
3 3 2 5 2 6
4 4 3 6 3 7
或在base R
merge/Reduce
lapply(split(list_example, sub("_.*", "", names(list_example))),
\(x) Reduce(\(...) merge(..., all = TRUE), x))
-输出
$type1
id a b c d
1 1 1 4 1 5
2 2 2 5 2 6
3 3 3 6 3 7
4 4 NA NA 4 8
5 5 NA NA 5 9
$type2
id e f g h
1 1 1 4 NA NA
2 2 NA NA 1 5
3 3 2 5 2 6
4 4 3 6 3 7
使用 lapply
-
nm <- names(list_example)
result <- lapply(data_types, function(x)
Reduce(function(p, q) merge(p, q, all = TRUE, by = 'id'),
list_example[grep(x, nm)]))
result
#[[1]]
# id a b c d
#1 1 1 4 1 5
#2 2 2 5 2 6
#3 3 3 6 3 7
#4 4 NA NA 4 8
#5 5 NA NA 5 9
#[[2]]
# id e f g h
#1 1 1 4 NA NA
#2 2 NA NA 1 5
#3 3 2 5 2 6
#4 4 3 6 3 7
如果要命名result
列表,可以添加。
names(result) <- data_types