【发布时间】:2017-03-27 16:44:17
【问题描述】:
当我有重复值并想保留第一个值时,我在使用 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 在函数内工作!谢谢!
【问题讨论】: