如何在有重复项时合并数据帧

时间:2017-08-17 00:32:45

标签: r dataframe

我想合并两个数据集:

DATA_A

 group |  x  |  y 
  101  |  1  |  test
  101  |  1  |  one
  102  |  7  |  two
  102  |  3  |  three

DATA_B

 group |  z  | 
  101  |  1  | 
  102  |  3  | 

我想在group = group和x = z时将data_a合并到data_b中。但是,有时会出现重复的情况,其中data_a中有两行被合并。相反,我想尽可能合并第一次出现:

DATA_B

 group |  z  | y
  101  |  1  | test
  102  |  3  | three

3 个答案:

答案 0 :(得分:1)

使用G. Grothendieck

中的数据
data_b$y = data_a$y[match(paste(data_b$group, data_b$z), paste(data_a$group, data_a$x))]
data_b
#  group z     y
#1   101 1  test
#2   102 3 three

答案 1 :(得分:0)

您可以使用dplyr执行此操作。 slice(1)保留每组group和x的第一行,然后执行内连接。

library(dplyr)
data_a %>% group_by(group,x) %>% slice(1) %>% inner_join(data_b,by=c("group"="group","x"="z"))
  group     x      y
  <int> <int> <fctr>
1   101     1   test
2   102     3  three

答案 2 :(得分:-1)

首先提取具有相同组的每组data_a行中的第一行,然后使用指示的连接将其与data_b合并。没有包使用。

data_a_u <- data_a[!duplicated(data_a[1]), ]
merge(data_b, data_a_u, all.y = TRUE, by = 1:2)

,并提供:

  group z    y
1   101 1 test
2   102 7  two

注意:可重复形式的输入数据是:

Lines_a <- "
group |  x  |  y 
  101  |  1  |  test
  101  |  1  |  one
  102  |  7  |  two
  102  |  3  |  three"
data_a <- read.table(text = Lines_a, header = TRUE, sep = "|", strip.white = TRUE)

Lines_b <- "
group |  z  | 
  101  |  1  | 
  102  |  3  |"
data_b <- read.table(text = Lines_b, header = TRUE, sep = "|", strip.white = TRUE)[1:2]