将 mutate_at 与 contains 结合使用以在多列上应用函数
Use mutate_at with contains to apply function on multiple columns
我想跨列名称中包含特定字符串的多个列应用一个函数。以下已停止工作。关于代码有什么问题的任何建议?
数据:
> df=data.frame(ab=1:5, ba=6:10, c=11:15, dc=16:20)
> df
ab ba c dc
1 1 6 11 16
2 2 7 12 17
3 3 8 13 18
4 4 9 14 19
5 5 10 15 20
尝试:
> df %>% dplyr::mutate_at(vars(contains("a"), contains("b")), funs(sqrt(.)))
Error: `.vars` must be a character/numeric vector or a `vars()` object, not a `data.frame` object.
Backtrace:
9. dplyr::mutate_at(., vars(contains("a"), contains("b")), funs(sqrt(.)))
10. dplyr:::manip_at(...)
11. dplyr:::tbl_at_syms(.tbl, .vars, .include_group_vars = .include_group_vars)
12. dplyr:::tbl_at_vars(tbl, vars, .include_group_vars = .include_group_vars)
13. dplyr:::bad_args(...)
14. dplyr:::glubort(fmt_args(args), ..., .envir = .envir)
使用matches
library(dplyr)
df %>%
mutate_at(vars(matches('a', 'b')), sqrt)
或者按照文档所述将 match
指定为字符向量
match - A character vector. If length > 1, the union of the matches is taken.
df %>%
mutate_at(vars(contains(match = c('a', 'b'))), sqrt)
ab ba c dc
1 1.000000 2.449490 11 16
2 1.414214 2.645751 12 17
3 1.732051 2.828427 13 18
4 2.000000 3.000000 14 19
5 2.236068 3.162278 15 20
_at/_all
已弃用,取而代之的是 across
df %>%
mutate(across(matches('a', 'b'), sqrt))
-输出
ab ba c dc
1 1.000000 2.449490 11 16
2 1.414214 2.645751 12 17
3 1.732051 2.828427 13 18
4 2.000000 3.000000 14 19
5 2.236068 3.162278 15 20
我不会再使用 mutate_at
,因为它已被 across
的用法所取代:
根据您是要对包含 a AND b 还是 a OR b 的所有列执行函数,您需要更改以下代码。目前它有一个 OR 条件。
library(dplyr)
df %>% mutate(across(contains("a") | contains("b"), sqrt))
ab ba c dc
1 1.000000 2.449490 11 16
2 1.414214 2.645751 12 17
3 1.732051 2.828427 13 18
4 2.000000 3.000000 14 19
5 2.236068 3.162278 15 20
我想跨列名称中包含特定字符串的多个列应用一个函数。以下已停止工作。关于代码有什么问题的任何建议?
数据:
> df=data.frame(ab=1:5, ba=6:10, c=11:15, dc=16:20)
> df
ab ba c dc
1 1 6 11 16
2 2 7 12 17
3 3 8 13 18
4 4 9 14 19
5 5 10 15 20
尝试:
> df %>% dplyr::mutate_at(vars(contains("a"), contains("b")), funs(sqrt(.)))
Error: `.vars` must be a character/numeric vector or a `vars()` object, not a `data.frame` object.
Backtrace:
9. dplyr::mutate_at(., vars(contains("a"), contains("b")), funs(sqrt(.)))
10. dplyr:::manip_at(...)
11. dplyr:::tbl_at_syms(.tbl, .vars, .include_group_vars = .include_group_vars)
12. dplyr:::tbl_at_vars(tbl, vars, .include_group_vars = .include_group_vars)
13. dplyr:::bad_args(...)
14. dplyr:::glubort(fmt_args(args), ..., .envir = .envir)
使用matches
library(dplyr)
df %>%
mutate_at(vars(matches('a', 'b')), sqrt)
或者按照文档所述将 match
指定为字符向量
match - A character vector. If length > 1, the union of the matches is taken.
df %>%
mutate_at(vars(contains(match = c('a', 'b'))), sqrt)
ab ba c dc
1 1.000000 2.449490 11 16
2 1.414214 2.645751 12 17
3 1.732051 2.828427 13 18
4 2.000000 3.000000 14 19
5 2.236068 3.162278 15 20
_at/_all
已弃用,取而代之的是 across
df %>%
mutate(across(matches('a', 'b'), sqrt))
-输出
ab ba c dc
1 1.000000 2.449490 11 16
2 1.414214 2.645751 12 17
3 1.732051 2.828427 13 18
4 2.000000 3.000000 14 19
5 2.236068 3.162278 15 20
我不会再使用 mutate_at
,因为它已被 across
的用法所取代:
根据您是要对包含 a AND b 还是 a OR b 的所有列执行函数,您需要更改以下代码。目前它有一个 OR 条件。
library(dplyr)
df %>% mutate(across(contains("a") | contains("b"), sqrt))
ab ba c dc
1 1.000000 2.449490 11 16
2 1.414214 2.645751 12 17
3 1.732051 2.828427 13 18
4 2.000000 3.000000 14 19
5 2.236068 3.162278 15 20