簡體   English   中英

如何使用 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問題是 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM