首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用mutate创建在向量中命名的列?

如何使用mutate创建在向量中命名的列?
EN

Stack Overflow用户
提问于 2021-04-09 00:00:08
回答 1查看 34关注 0票数 1

我有一个tibble,我想使用一个字符向量向它添加列。向量的名称将是新列的名称,新列应填充向量值(对每行重复)。使用for循环很容易做到这一点,但是我正在尝试理解across是如何工作的,并且我遇到了两个问题。

代码语言:javascript
运行
复制
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

这会产生:

代码语言:javascript
运行
复制
# 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,但对如何将常规函数转换为适当类型的对象一无所知。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-09 00:08:29

当数据集中存在列时,并且如果我们希望通过指定.names来更改列名来更新这些列或从该列创建新列,则可以使用across。在这里,一种方法是使用map循环遍历名称,使用transmute创建列,并将这些列与原始数据绑定

代码语言:javascript
运行
复制
library(purrr)
library(dplyr)
map_dfc(names(cv), ~ tib %>%
                     transmute(!! .x := myf(.x))) %>%
       bind_cols(tib, .)

-output

代码语言:javascript
运行
复制
# 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    
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67007697

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档