r - 跨多个变量粘贴变量名称及其向量值

标签 r dplyr rlang tidyeval

假设我有这个数据框:

library(dplyr)

set.seed(1)
df <- tibble(sol_1 = sample(1:4, 10, replace = TRUE),
             sol_2 = sample(1:4, 10, replace = TRUE))

# A tibble: 10 x 2
   sol_1 sol_2
   <int> <int>
 1     1     3
 2     4     3
 3     3     1
 4     1     1
 5     2     1
 6     1     2
 7     3     2
 8     3     2
 9     2     2
10     2     3

我想更改变量中的值以包含它们各自的变量名称,如下所示:

# A tibble: 10 x 2
         sol_1       sol_2
         <chr>       <chr>
 1     sol_1_1     sol_2_3
 2     sol_1_4     sol_2_3
 3     sol_1_3     sol_2_1
 4     sol_1_1     sol_2_1
 5     sol_1_2     sol_2_1
 6     sol_1_1     sol_2_2
 7     sol_1_3     sol_2_2
 8     sol_1_3     sol_2_2
 9     sol_1_2     sol_2_2
10     sol_1_2     sol_2_3

哪个 rlang 变量会指示将变量名称用作字符串?我尝试过类似以下内容:

mutate_at(df, vars(starts_with("sol")), ~ paste(rlang::as_string(.x), .x, sep = "_"))

但显然我使用了错误的函数。

最佳答案

另一种选择是将其 reshape 为“长”,然后在转换后将其变回“宽”

library(dplyr)
library(tidyr)
library(stringr)
df %>%
   mutate(rn = row_number()) %>% 
   pivot_longer(cols = -rn) %>% 
   mutate(value = str_c(name, value, sep="_")) %>% 
   pivot_wider(names_from = name, values_from = value) %>%
   select(-rn)
# A tibble: 10 x 2
#   sol_1   sol_2  
#   <chr>   <chr>  
# 1 sol_1_1 sol_2_3
# 2 sol_1_4 sol_2_3
# 3 sol_1_3 sol_2_1
# 4 sol_1_1 sol_2_1
# 5 sol_1_2 sol_2_1
# 6 sol_1_1 sol_2_2
# 7 sol_1_3 sol_2_2
# 8 sol_1_3 sol_2_2
# 9 sol_1_2 sol_2_2
#10 sol_1_2 sol_2_3

或者使用imap

library(purrr)
imap(df, ~ str_c(.y, .x, sep="_"))

关于r - 跨多个变量粘贴变量名称及其向量值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59119572/

相关文章:

r - dplyr 取消引用不适用于过滤功能

r - dplyr 使用 lubridate::hhmm 格式和 minute() 进行过滤

r - 使用 `$` 运算符的准引用

r - 在一个函数中分布多个列

r - 数据表 |组内更快的逐行递归更新

重命名拟合模型对象中的术语

r - 如何将自定义函数应用于数据框的每一列

r - 如何在 mutate_at 中取消引用拼接?

r - 使用 rvest (R) 进行网络抓取时停止使用 url

rvest : how to follow_link an image in a webpage?