在管道中动态连接数据框中的列

问题描述 投票:0回答:1

我有一个将数据帧合并在一起的过程,然后通过将一些列连接在一起来生成 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))

是否有一种很好的方法将这两种方法合并在一起,以便我可以保留管道结构但动态引用列名称?

r dplyr pipe
1个回答
0
投票

假设所示的测试数据。 请注意,

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
© www.soinside.com 2019 - 2024. All rights reserved.