如何动态传递 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"
假设数据如下:
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"