连接R中数据框内的值

时间:2018-03-29 08:36:27

标签: r

我有两个数据框

> data1
  LEVEL V1 V2
1    L1  a  c
2    L2  b  d
> data2
  LEVEL V1 V2
1    L1  1  3
2    L2  2  4

如何创建第三个数据框

> data3
  LEVEL  V1  V2
1    L1 a_1 c_3
2    L2 b_2 d_4

优选在R中使用dplyr / tidyr

3 个答案:

答案 0 :(得分:3)

您可rbind.data.frame然后summarise_allLEVEL

data <- rbind.data.frame(data1, data2) # rbind data frames
data %>%
        group_by(LEVEL) %>%
        summarise_all(paste, collapse = "_")
# A tibble: 2 x 3
  LEVEL    V1    V2
  <chr> <chr> <chr>
1    L1   a_1   c_3
2    L2   b_2   d_4

答案 1 :(得分:1)

以下是使用mapply

的一个选项
data.frame(data1[, 1, drop = FALSE],
           mapply(FUN = paste, MoreArgs = list(sep = "_"), data1[,-1], data2[,-1]))
#  LEVEL  V1  V2
#1    L1 a_1 c_3
#2    L2 b_2 d_4

或使用tidyverse

library(purrr)
library(dplyr)
bind_cols(data2[, 1, drop = FALSE],
          map2_df(.x = data1[, -1], .y = data2[, -1], .f = paste, sep = "_"))
#  LEVEL  V1  V2
#1    L1 a_1 c_3
#2    L2 b_2 d_4

数据

data1 <- read.table(text = "
LEVEL V1 V2
1    L1  a  c
2    L2  b  d", header = TRUE)

data2 <- read.table(text = "
LEVEL V1 V2
1    L1  1  3
2    L2  2  4", header = TRUE)

答案 2 :(得分:0)

根据您的示例,我假设您希望使用LEVEL作为匹配两个表的键,并且您没有太多的变量需要处理。

df3 <- left_join(df1, df2, by="LEVEL")%>%
  mutate(a=paste(a.x, a.y, sep="_"), b=paste(b.x, b.y, sep="_")) %>%
  select_if(grepl("\\.", colnames(df3)) ==FALSE)