连接 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