如何使用 mutate 创建以向量命名的列?
How can I use mutate to create columns named in a vector?
我有一个 tibble
,我想使用字符向量向其中添加列。向量的名称将成为新列的名称,新列应填充向量的值(对每一行重复)。使用 for 循环很容易做到这一点,但我试图了解 across
的工作原理,但我遇到了两个问题。
cv <- c("a"="x", "b"="y", "c"="z")
tib <- tibble(c1=1:5)
myf <- function(x) { cv[x]}
tib %>% mutate(across(all_of(names(cv))), myf) ## first problem
# Error: Problem with `mutate()` input `..1`.
# x Can't subset columns that don't exist.
# x Columns `a`, `b`, and `c` don't exist.
tib %>% mutate_at(all_of(names(cv)), myf)
# ℹ Input `..1` is `across(all_of(names(cv)))`.
for (x in names(cv)) { ## do it with a for loop
tib[[x]] <- myf(x)
}
tib %>% mutate(across(all_of(names(cv)), myf)) ## second problem
产生:
# A tibble: 5 x 4
c1 a b c
<int> <chr> <chr> <chr>
1 1 NA NA NA
2 2 NA NA NA
3 3 NA NA NA
4 4 NA NA NA
5 5 NA NA NA
用 tib %>% mutate_at(all_of(names(cv)), myf)
替换最后一行会产生同样的错误行为。
第一个问题是 mutate across
似乎不喜欢创建新专栏,原因我无法理解。第二个问题是 across
不知道如何处理 myf
。它似乎想要某种我不知道如何创建的关闭。 (与 mutate_at
相同。)我已经简要地查看了 rlang
,但无法弄清楚如何将常规函数转换为适当类型的对象。
当数据集中存在列时,如果我们想更新这些列或通过指定 .names
更改列名从该列创建新列,则可以使用 across
。在这里,一种方法是使用 map
遍历名称,使用 transmute
创建列并将这些列与原始数据绑定
library(purrr)
library(dplyr)
map_dfc(names(cv), ~ tib %>%
transmute(!! .x := myf(.x))) %>%
bind_cols(tib, .)
-输出
# A tibble: 5 x 4
# c1 a b c
# <int> <chr> <chr> <chr>
#1 1 x y z
#2 2 x y z
#3 3 x y z
#4 4 x y z
#5 5 x y z
我有一个 tibble
,我想使用字符向量向其中添加列。向量的名称将成为新列的名称,新列应填充向量的值(对每一行重复)。使用 for 循环很容易做到这一点,但我试图了解 across
的工作原理,但我遇到了两个问题。
cv <- c("a"="x", "b"="y", "c"="z")
tib <- tibble(c1=1:5)
myf <- function(x) { cv[x]}
tib %>% mutate(across(all_of(names(cv))), myf) ## first problem
# Error: Problem with `mutate()` input `..1`.
# x Can't subset columns that don't exist.
# x Columns `a`, `b`, and `c` don't exist.
tib %>% mutate_at(all_of(names(cv)), myf)
# ℹ Input `..1` is `across(all_of(names(cv)))`.
for (x in names(cv)) { ## do it with a for loop
tib[[x]] <- myf(x)
}
tib %>% mutate(across(all_of(names(cv)), myf)) ## second problem
产生:
# A tibble: 5 x 4
c1 a b c
<int> <chr> <chr> <chr>
1 1 NA NA NA
2 2 NA NA NA
3 3 NA NA NA
4 4 NA NA NA
5 5 NA NA NA
用 tib %>% mutate_at(all_of(names(cv)), myf)
替换最后一行会产生同样的错误行为。
第一个问题是 mutate across
似乎不喜欢创建新专栏,原因我无法理解。第二个问题是 across
不知道如何处理 myf
。它似乎想要某种我不知道如何创建的关闭。 (与 mutate_at
相同。)我已经简要地查看了 rlang
,但无法弄清楚如何将常规函数转换为适当类型的对象。
当数据集中存在列时,如果我们想更新这些列或通过指定 .names
更改列名从该列创建新列,则可以使用 across
。在这里,一种方法是使用 map
遍历名称,使用 transmute
创建列并将这些列与原始数据绑定
library(purrr)
library(dplyr)
map_dfc(names(cv), ~ tib %>%
transmute(!! .x := myf(.x))) %>%
bind_cols(tib, .)
-输出
# A tibble: 5 x 4
# c1 a b c
# <int> <chr> <chr> <chr>
#1 1 x y z
#2 2 x y z
#3 3 x y z
#4 4 x y z
#5 5 x y z