如何动态传递 tidyverse 中的列

How to dynamically pass columns in tidyverse's across

假设数据如下:

df <- data.frame(id     = 1:3,
                 result1 = 4:6,
                 result2 = letters[7:9],
                 result1_label = "test label 1",
                 result2_label = "test label 2")

我现在想创建一个按行 (!) 列表列,我将 result1 与 result1_label 放在一起,result2 也是如此。

现在,我可以使用 tidyverse 的 across 来“循环”我的结果列。但是,我不知道如何动态传递相应的标签。

这是我的想法:

library(tidyverse)
df_new <- df %>%
  rowwise() %>%
  mutate(across(c(result1, result2), ~list(list("answer" = .,
                                                "label"  = sym(paste0(cur_column(),"_label")))),
                .names = "question_{.col}"))

它创建了我想要的列。但是,如果您更仔细地查看数据,您会发现它没有写入 result1_label 列中的实际值,而是写入 "symbol result1_label":

str(df_new$question_result1)

    tibble [3 x 1] (S3: rowwise_df/tbl_df/tbl/data.frame)
 $ question_result1:List of 3
  ..$ :List of 2
  .. ..$ answer: int 4
  .. ..$ label : symbol result1_label
  ..$ :List of 2
  .. ..$ answer: int 5
  .. ..$ label : symbol result1_label
  ..$ :List of 2
  .. ..$ answer: int 6
  .. ..$ label : symbol result1_label

知道如何为相应的标签列传递实际值吗?

请注意,我的真实示例可能有数百个这样的列,这就是我需要自动化的原因。

我最初虽然只是 pivot_longer 我的数据,这样我有一个结果列和一个标签列,但这不起作用,因为各自的结果列有不同 类(数字和字符)。

使用get:

df_new <- df %>%
  rowwise() %>%
  mutate(across(c(result1, result2), ~list(list("answer" = .,
                                                "label"  = get(paste0(cur_column(),"_label")))),
                .names = "question_{.col}"))
> str(df_new$question_result1)
List of 3
 $ :List of 2
  ..$ answer: int 4
  ..$ label : chr "test label 1"
 $ :List of 2
  ..$ answer: int 5
  ..$ label : chr "test label 1"
 $ :List of 2
  ..$ answer: int 6
  ..$ label : chr "test label 1"