R重复连接功能

时间:2017-03-27 16:44:18

标签: r function dplyr

当我有重复的值并希望保留第一个值时,我使用dplyr的连接函数遇到了问题,所以我决定编写自己的函数。如果有功能已经这样做,请告诉我!它可能更好写和有效。

以下是包含一些示例数据的代码:

dt1 <- data.table(A = c(rep(1, 3), rep(2, 3)), B = rep(1:3, 2),
                  C = runif(n = 6, min = 0, max = 10))
dt2 <- data.table(A = c(rep(3, 3), rep(4, 3)), B = rep(1:3, 2),
                  C = runif(n = 6, min = 0, max = 10))
dt3 <- data.table(A = c(rep(3, 3), rep(4, 3)), B = rep(1:3, 2),
                  D = runif(n = 6, min = 0, max = 10))
dt4 <- data.table(A = c(rep(2, 3), rep(3, 3)), B = rep(1:3, 2),
                  D = runif(n = 6, min = 0, max = 10))

dt5 <- duplicate_join(dt1, dt2)
dt6 <- duplicate_join(dt5, dt3)
dt7 <- duplicate_join(dt6, dt4)

duplicate_join <- function(dt1, dt2) {

  melt1 <- dt1 %>%
    gather(variable, value, -c(A, B), na.rm = TRUE)
  melt2 <- dt2 %>%
    gather(variable, value, -c(A, B), na.rm = TRUE)

  join <- rbindlist(list(melt1, melt2), use.names = TRUE) %>%
    distinct(A, B, variable, .keep_all = TRUE) %>%
    spread(variable, value)
  join
}

我的问题是让用户决定收集哪些列并检查重复值。在这种情况下,将AB转换为通用表达式。我已经阅读了FunctionsCapturing Un-evaluated Dots,并查看了执行此操作的函数的源代码(ggplot),但没有任何意义。我尝试过很多技巧并遇到错误object 'A' not foundinvalid argument to unary operator

函数调用是否为:

对我来说无关紧要
duplicate_join <- function(dt1, dt2, ...) {}

或者:

duplicate_join <- function(dt1, dt2, cols) {}

我只需要知道如何让...cols在函数中运行!谢谢!

1 个答案:

答案 0 :(得分:1)

您正在寻找来自Dplyr Package的Semi Join

描述:

  

semi_join(x,y):返回x中匹配值的所有行,只保留x中的列。半连接与内连接不同,因为内连接将为y的每个匹配行返回一行x,其中半连接将永远不会复制x的行。这是一个过滤联接。

这里使用您的代码是semi_join的一个例子:

#Semi Joining by equality of "B" Columns, Keeping dt1, 
#if you want to keep dt2, just change the parameters order
dt4 <- semi_join(dt1, dt2, by = c("B" = "B"))

Output:

  A B         C
1 1 1 5.3330819
2 2 1 0.1652472
3 1 2 4.6283878
4 2 2 1.5570931
5 1 3 9.6967720
6 2 3 1.1587919

#Semi Joining: Multiple Columns
dt5 <- semi_join(dt1, dt2, by = c("A" = "A", "B" = "B"))
#No output, there's no rows that satisfy "A" = "A" and "B" = "B"