我有一个将数据帧合并在一起的过程,然后通过将一些列连接在一起来生成 ID 变量。但是,需要连接的列的名称位于字符向量中。
我可以分步执行此操作,如下所示:
new <- merge(old1, old2, by = "MergeVar")
id <- do.call(paste0, new[idcols])
new$id <- id
但是,我想使用管道来做到这一点。如果列是固定的,那么我知道我可以做这样的事情:
new <- merge(old1, old2, by = "MergeVar") %>%
mutate(id = paste0(colA, colB))
是否有一种很好的方法将这两种方法合并在一起,以便我可以保留管道结构但动态引用列名称?
假设所示的测试数据。 请注意,
BOD
与 R 一起提供。
对于基础 R,我们使用
merge
,然后创建一个包含单个 x
组件的列表,其中包含 merge
结果,然后在管道的最后一段中使用它。
使用 dplyr,我们可以使用
left_join
并使用 !!sym(...) and
!!!syms(...) 来插入变量。
# test data #######################
old1 <- old2 <- head(BOD, 3)
by_var <- "Time"
idcols <- c("demand.x", "demand.y")
# Base R #######################
merge(old1, old2, by = by_var) |>
list(x = _) |>
with(transform(x, id = do.call("paste0", x[idcols])))
## Time demand.x demand.y id
## 1 1 8.3 8.3 8.38.3
## 2 2 10.3 10.3 10.310.3
## 3 3 19.0 19.0 1919
# tidyverse #######################
library(dplyr)
old1 %>%
left_join(old2, join_by(!!sym(by_var))) %>%
mutate(id = paste0(!!!idcols))
## Time demand.x demand.y id
## 1 1 8.3 8.3 demand.xdemand.y
## 2 2 10.3 10.3 demand.xdemand.y
## 3 3 19.0 19.0 demand.xdemand.y