[英]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
問題是 cross 不知道如何處理myf
。 它似乎想要某種我不知道如何創建的閉包。 (與mutate_at
相同。)我已經簡要地查看了rlang
,但無法確定如何將常規 function 轉換為適當類型的 object。
當數據集中存在列並且我們想要更新這些列或across
指定.names
從該列創建新列來更改列名時,可以使用交叉。 在這里,一種方法是使用transmute
遍歷名稱,使用map
創建列並將這些列與原始數據綁定
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.