使用 mutate_at、starts_with 和 case_when 与列表一起更改多列的值

Using mutate_at, starts_with and case_when with list to change values of multiple columns

我有一个简短的问题。我想一次更改多个列值(基本上是将数值更改为问卷中的字符串)。我找到了一种使用 mutate_atcase_when 的方法。该示例使用了 funs,有人告诉我用列表替换它,但是它不起作用。我不确定我是否使用 list() 不正确,或者是否有其他问题。这是一个产生与我的数据相同的错误的示例:

library(tidyverse)

q11_1 <- sample(rep(c(1:4), 10))
q11_2 <- sample(rep(c(1:4), 10))
q12_1 <- sample(rep(c(1:4), 10))
q12_2 <- sample(rep(c(1:4), 10))
df <- data.frame(q11_1, q11_2, q12_1, q12_2)

df %>%
  mutate_at(
    vars(starts_with('q11')), 
    list(case_when(
      . == 1 ~ "Yes", 
      . == 2 ~ "No", 
      . == 3 ~ "Maybe", 
      . == 4 ~ "Don't know"
    ))
  )

澄清一下:我有一个包含 q11_1、q11_2 ... 等的数据集,我想更改所有以 q11 开头的变量(均为数字)的值。我得到的错误是:

Error in get(.x, .env, mode = "function") : first argument has length > 1

你没有给出预期的输出,但我相信这就是你想要的。

我们现在应该像这样使用 across(),因为 mutate_at 已被弃用。 across 接受两个参数;一个到 select 列,第二个是应该应用于这些列的函数。此外,无需将 case_when 语句包装在 list.

df %>%
  mutate(
    across(starts_with('q11'), 
    function(x) case_when(
      x == 1 ~ "Yes", 
      x == 2 ~ "No", 
      x == 3 ~ "Maybe", 
      x == 4 ~ "Don't know"
    )
  )
)
        q11_1      q11_2 q12_1 q12_2
1          No         No     4     1
2          No        Yes     4     2
3         Yes Don't know     1     2
4  Don't know Don't know     1     2
5  Don't know        Yes     3     1
6          No      Maybe     4     1
7         Yes         No     3     3
8  Don't know      Maybe     3     3
9       Maybe      Maybe     3     4
10 Don't know Don't know     4     1
11      Maybe         No     1     2
12      Maybe      Maybe     1     2
13      Maybe Don't know     4     1
14        Yes         No     3     4
15 Don't know        Yes     2     3
16      Maybe         No     3     4
17        Yes         No     4     1
18        Yes Don't know     3     4
19      Maybe         No     3     2
20      Maybe      Maybe     1     3
21        Yes      Maybe     2     2
22        Yes      Maybe     1     3
23 Don't know      Maybe     1     2
24      Maybe        Yes     2     4
25         No        Yes     1     3