连接 R 中两个数据框中的值
Concatenate values in two data frames in R
给定两个具有相同列名的数据框:
a <- data.frame(x=1:4,y=5:8)
b <- data.frame(x=LETTERS[1:4],y=LETTERS[5:8])
>a
x y
1 5
2 6
3 7
4 8
>b
x y
A E
B F
C G
D H
如何连接同名的每一列?
期望的输出:
cat_x cat_y
1 A 5 E
2 B 6 F
3 C 7 G
4 D 8 H
到目前为止已尝试,一次合并一个列:
a$cat_x <- paste(a$x,b$x)
a$cat_y <- paste(a$y,b$y)
这种方法有效,但实际数据有 40 列(并且将包括更多的数据帧)。正在寻找一种更有效的方法来处理更大的数据帧。
我们可以使用 Map
循环执行此操作
data.frame(Map(paste, setNames(a, paste0("cat_", names(a))), b,
MoreArgs = list(sep = "_")))
-输出
cat_x cat_y
1 1_A 5_E
2 2_B 6_F
3 3_C 7_G
4 4_D 8_H
使用上面的 sep
以防我们要添加分隔符。否则默认情况下它将是 space
data.frame(Map(paste, setNames(a, paste0("cat_", names(a))), b ))
cat_x cat_y
1 1 A 5 E
2 2 B 6 F
3 3 C 7 G
4 4 D 8 H
另一个可能的解决方案,使用 purrr::map2_dfc
:
library(tidyverse)
map2_dfc(a,b, ~ str_c(.x, .y, sep = " ")) %>%
rename_with(~ str_c("cat", .x, sep = "_"))
#> # A tibble: 4 × 2
#> cat_x cat_y
#> <chr> <chr>
#> 1 1 A 5 E
#> 2 2 B 6 F
#> 3 3 C 7 G
#> 4 4 D 8 H
给定两个具有相同列名的数据框:
a <- data.frame(x=1:4,y=5:8)
b <- data.frame(x=LETTERS[1:4],y=LETTERS[5:8])
>a
x y
1 5
2 6
3 7
4 8
>b
x y
A E
B F
C G
D H
如何连接同名的每一列?
期望的输出:
cat_x cat_y
1 A 5 E
2 B 6 F
3 C 7 G
4 D 8 H
到目前为止已尝试,一次合并一个列:
a$cat_x <- paste(a$x,b$x)
a$cat_y <- paste(a$y,b$y)
这种方法有效,但实际数据有 40 列(并且将包括更多的数据帧)。正在寻找一种更有效的方法来处理更大的数据帧。
我们可以使用 Map
循环执行此操作
data.frame(Map(paste, setNames(a, paste0("cat_", names(a))), b,
MoreArgs = list(sep = "_")))
-输出
cat_x cat_y
1 1_A 5_E
2 2_B 6_F
3 3_C 7_G
4 4_D 8_H
使用上面的 sep
以防我们要添加分隔符。否则默认情况下它将是 space
data.frame(Map(paste, setNames(a, paste0("cat_", names(a))), b ))
cat_x cat_y
1 1 A 5 E
2 2 B 6 F
3 3 C 7 G
4 4 D 8 H
另一个可能的解决方案,使用 purrr::map2_dfc
:
library(tidyverse)
map2_dfc(a,b, ~ str_c(.x, .y, sep = " ")) %>%
rename_with(~ str_c("cat", .x, sep = "_"))
#> # A tibble: 4 × 2
#> cat_x cat_y
#> <chr> <chr>
#> 1 1 A 5 E
#> 2 2 B 6 F
#> 3 3 C 7 G
#> 4 4 D 8 H