如何使用字符串变量访问 mutate() 中的现有列
How to access an existing column in mutate() with a string variable
我已经阅读了 Use dynamic variable names in `dplyr`
但我的问题是用一个存储为字符串变量的列名来改变一个已经存在的列。
data <- tibble::tribble(
~colA, ~colB,
1, 2,
3, 4
)
namestring <- "colA"
----
> data
# A tibble: 2 x 2
colA colB
<dbl> <dbl>
1 1 2
2 3 4
> namestring
[1] "colA"
现在我想使用 namestring
修改 colA
没有namestring的想要的输出是这样的。
data %>%
dplyr::mutate(colA = colB * 100)
## A tibble: 2 x 2
# colA colB
# <dbl> <dbl>
#1 200 2
#2 400 4
但是使用 dplyr 编程时出现错误
namestring <- "colA"
data %>%
dplyr::mutate(.data[[namestring]] = colB + 2)
# Error: unexpected '=' in:
# "data %>%
# dplyr::mutate(.data[[namestring]] ="
filter
和 select
在 LHS
上使用 .data[[string]]
不会产生相同类型的错误
data %>%
dplyr::filter(.data[[namestring]] == 3)
## A tibble: 1 x 2
# colA colB
# <dbl> <dbl>
#1 3 4
我们可以使用 :=
和 !!
library(dplyr)
data %>%
mutate(!! namestring := colB * 100)
-输出
# A tibble: 2 x 2
# colA colB
# <dbl> <dbl>
#1 200 2
#2 400 4
或者可以在across
以内
data %>%
mutate(across(all_of(namestring), ~ colB* 100))
# A tibble: 2 x 2
# colA colB
# <dbl> <dbl>
#1 200 2
#2 400 4
我已经阅读了 Use dynamic variable names in `dplyr` 但我的问题是用一个存储为字符串变量的列名来改变一个已经存在的列。
data <- tibble::tribble(
~colA, ~colB,
1, 2,
3, 4
)
namestring <- "colA"
----
> data
# A tibble: 2 x 2
colA colB
<dbl> <dbl>
1 1 2
2 3 4
> namestring
[1] "colA"
现在我想使用 namestring
colA
没有namestring的想要的输出是这样的。
data %>%
dplyr::mutate(colA = colB * 100)
## A tibble: 2 x 2
# colA colB
# <dbl> <dbl>
#1 200 2
#2 400 4
但是使用 dplyr 编程时出现错误
namestring <- "colA"
data %>%
dplyr::mutate(.data[[namestring]] = colB + 2)
# Error: unexpected '=' in:
# "data %>%
# dplyr::mutate(.data[[namestring]] ="
filter
和 select
在 LHS
.data[[string]]
不会产生相同类型的错误
data %>%
dplyr::filter(.data[[namestring]] == 3)
## A tibble: 1 x 2
# colA colB
# <dbl> <dbl>
#1 3 4
我们可以使用 :=
和 !!
library(dplyr)
data %>%
mutate(!! namestring := colB * 100)
-输出
# A tibble: 2 x 2
# colA colB
# <dbl> <dbl>
#1 200 2
#2 400 4
或者可以在across
data %>%
mutate(across(all_of(namestring), ~ colB* 100))
# A tibble: 2 x 2
# colA colB
# <dbl> <dbl>
#1 200 2
#2 400 4