使用 mutate_at、starts_with 和 case_when 与列表一起更改多列的值
Using mutate_at, starts_with and case_when with list to change values of multiple columns
我有一个简短的问题。我想一次更改多个列值(基本上是将数值更改为问卷中的字符串)。我找到了一种使用 mutate_at
和 case_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
我有一个简短的问题。我想一次更改多个列值(基本上是将数值更改为问卷中的字符串)。我找到了一种使用 mutate_at
和 case_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