合并两个表,并在R中仅保留重复的值

时间:2019-07-25 11:10:11

标签: r

我想合并两个表,并且只保留两个表中的相似Task。不常见的Task已删除。如果两个Task相似,我只会保留较小的值, 像这样的两个表

x<-data.frame("Task"=c("A","B","C","D","E"),"FC"=c(12,NA,15,14,NA),FH=c(13,15,NA,17,20))
   Task FC FH
1    A 12 13
2    B NA 15
3    C 15 NA
4    D 14 17
5    E NA 20
y<-data.frame("Task"=c("B","C","F","G"),"FC"=c(NA,12,20,NA),FH=c(NA,17,18,NA))
  Task FC FH
1    B NA NA
2    C 12 17
3    F 20 18
4    G NA NA

我想要这样的输出

  Task FC FH
2    B NA 15
3    C 12 17

2 个答案:

答案 0 :(得分:5)

一种dplyr可能是:

x %>%
 bind_rows(y) %>%
 group_by(Task) %>%
 filter(n() > 1) %>%
 summarise_all(~ ifelse(all(is.na(.)), NA, min(., na.rm = TRUE)))

  Task     FC    FH
  <chr> <dbl> <dbl>
1 B        NA    15
2 C        12    17

或者每个df可能有重复的任务:

x %>%
 bind_rows(y, .id = "ID") %>%
 group_by(Task) %>%
 filter(n() > 1 & n_distinct(ID) > 1) %>%
 summarise_all(~ ifelse(all(is.na(.)), NA, min(., na.rm = TRUE))) %>%
 select(-ID)

答案 1 :(得分:0)

您也可以这样做:

# Perform a join
merged <- merge(x = x, y = y, by = "Task")

# Get the minimum value out of two comparable columns
merged$FC <- with(merged, pmin(FC.x, FC.y, na.rm = TRUE))
merged$FH <- with(merged, pmin(FH.x, FH.y, na.rm = TRUE))

# Delete the unwanted columns appearing out of merge
merged <- merged[-c(2:5)]

输出:

  Task FC FH
1    B NA 15
2    C 12 17