当我有重复的值并希望保留第一个值时,我使用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
}
我的问题是让用户决定收集哪些列并检查重复值。在这种情况下,将A
和B
转换为通用表达式。我已经阅读了Functions,Capturing Un-evaluated Dots,并查看了执行此操作的函数的源代码(ggplot
),但没有任何意义。我尝试过很多技巧并遇到错误object 'A' not found
或invalid argument to unary operator
。
函数调用是否为:
对我来说无关紧要duplicate_join <- function(dt1, dt2, ...) {}
或者:
duplicate_join <- function(dt1, dt2, cols) {}
我只需要知道如何让...
或cols
在函数中运行!谢谢!
答案 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"