当前位置: 首页 > 知识库问答 >
问题:

在调用时使用dplyr mutate\u中的多列函数

督劲
2023-03-14

我想使用dplyr的mutate_at函数将一个函数应用于数据帧中的几个列,其中该函数输入它直接应用到的列以及数据帧中的另一列。

作为一个具体的例子,我希望改变以下数据帧

# Example input dataframe
df <- data.frame(
    x = c(TRUE, TRUE, FALSE),
    y = c("Hello", "Hola", "Ciao"),
    z = c("World", "ao", "HaOlam")
)

mutate_at调用类似

df %>%
mutate_at(.vars = vars(y, z),
          .funs = ifelse(x, ., NA))

返回一个看起来像这样的数据框

# Desired output dataframe
df2 <- data.frame(x = c(TRUE, TRUE, FALSE),
                  y_1 = c("Hello", "Hola", NA),
                  z_1 = c("World", "ao", NA))

所需的mutate_at调用将类似于以下对Mutate的调用:

df %>%
   mutate(y_1 = ifelse(x, y, NA),
          z_1 = ifelse(x, z, NA))

我知道这可以通过几种方式在base R中实现,但为了可读性、与数据库的接口等,我特别希望使用dplyr的mutate\u at函数来实现这一目标。

在dplyr mutate调用中添加多列

dplyr::变异以添加多个值

使用dplyr的Mutate()函数在sum()函数中使用列

共有2个答案

顾乐家
2023-03-14

为了补充之前的回答,如果您想添加新变量(而不是替换),如原始问题中的名称,如z_1和y_1,则只需:

  • dplyr
library(tidyverse)

df <- data.frame(
  x = c(TRUE, TRUE, FALSE),
  y = c("Hello", "Hola", "Ciao"),
  z = c("World", "ao", "HaOlam")
)

## Version >=1
df %>%
  mutate(across(c(y, z), 
                list(~ifelse(x, ., NA)),
                .names="{.col}_1"))
#>       x     y      z   y_1   z_1
#> 1  TRUE Hello  World Hello World
#> 2  TRUE  Hola     ao  Hola    ao
#> 3 FALSE  Ciao HaOlam  <NA>  <NA>


## 0.8 - <1
df %>%
  mutate_at(.vars = vars(y, z),
            .funs = list(`1`=~ifelse(x, ., NA)))
#>       x     y      z   y_1   z_1
#> 1  TRUE Hello  World Hello World
#> 2  TRUE  Hola     ao  Hola    ao
#> 3 FALSE  Ciao HaOlam  <NA>  <NA>

## Before 0.8
df %>%
  mutate_at(.vars = vars(y, z),
            .funs = funs(`1`=ifelse(x, ., NA)))
#> Warning: `funs()` is deprecated as of dplyr 0.8.0.
#> Please use a list of either functions or lambdas: 
#> 
#>   # Simple named list: 
#>   list(mean = mean, median = median)
#> 
#>   # Auto named with `tibble::lst()`: 
#>   tibble::lst(mean, median)
#> 
#>   # Using lambdas
#>   list(~ mean(., trim = .2), ~ median(., na.rm = TRUE))
#> This warning is displayed once every 8 hours.
#> Call `lifecycle::last_warnings()` to see where this warning was generated.
#>       x     y      z   y_1   z_1
#> 1  TRUE Hello  World Hello World
#> 2  TRUE  Hola     ao  Hola    ao
#> 3 FALSE  Ciao HaOlam  <NA>  <NA>

由reprex包(v0.3.0)于2020-10-03创建

有关更多详细信息和技巧,请参阅:使用mutate_at创建新变量,同时保留原始变量

端木野
2023-03-14

这是由@eipi10在@eipi10对这个问题的评论中回答的,但我写在这里是为了子孙后代。

这里的解决方案是使用:

df %>%
   mutate_at(.vars = vars(y, z),
             .funs = list(~ ifelse(x, ., NA)))

您还可以将新的跨()函数与mutate()一起使用,如下所示:

df %>%
   mutate(across(c(y, z), ~ ifelse(x, ., NA)))

公式运算符的使用(如~ifelse(...))表明ifelse(x,., NA)是一个匿名函数,在调用mutate_at()时定义。

这类似于在调用mutate\u at()之外定义函数,如下所示:

temp_fn <- function(input) ifelse(test = df[["x"]],
                                  yes = input,
                                  no = NA)

df %>%
   mutate_at(.vars = vars(y, z),
             .funs = temp_fn)

注意dplyr中的语法变化:在dplyr版本0.8.0之前,您只需编写<代码>。funs=funs(ifelse(x,,,NA)),但函数funs()正在被弃用,不久将从dplyr中删除。

 类似资料:
  • 问题内容: 我正在使用python 2.7,并尝试在自己的进程中运行一些CPU繁重的任务。我希望能够将消息发送回父流程,以使其随时了解流程的当前状态。为此,多处理队列似乎很完美,但我不知道如何使它工作。 因此,这是我的基本工作示例,减去了Queue的使用。 我尝试以几种方式传递队列,它们收到错误消息“ RuntimeError:队列对象仅应通过继承在进程之间共享”。这是我根据之前发现的答案尝试的一

  • 问题定义 我在使用BeautifulSoup模块(bs4)时遇到一些问题。我需要解析一些CSS类的(findAll())字符串,并使用get_text()函数对它们进行解包(或者可以说从soup中移除所有标记),但有一些误解。我想做一碗汤 和soup显示指定url的html代码。 稍后我想把数据变量转换成,这是我想要访问的数据,并且只显示。类型后来,我的IDE说您不能使用 就这样。因为soup实例

  • 问题内容: 我正在使用Ionic,并且想要根据数据动态更改每个项目的背景色。我以为我可以通过函数调用的方式返回正确的类 目前是控制器 在检查控制台时,列表中的每个函数均被调用7次。这是为什么,我应该避免在其中使用函数调用吗? 问题答案: AngularJS可以进行脏检查:它需要在 每个循环中 调用该函数,以确保它不返回新值,并且不需要更新DOM。 这是框架典型过程的一部分,调用像您这样简单的函数不

  • 问题内容: 我试图在jQuery中使用getJSON函数导入一些数据并触发回调函数。回调函数未运行。但是,如果我使用get函数尝试相同的操作,则效果很好。奇怪的是,即使我将“ json”作为类型传递,它也可以与get函数一起使用。为什么会这样呢?我在Firefox 3和IE 7中测试了以下文件: 只要我访问的URL在同一个域中,这似乎都会发生。我尝试传递一些数据,但这没有什么不同。 当然,可以像在

  • 问题内容: 如何调用函数列表并使用列表推导? 我知道我能做 但是我可以在下面做吗? 如果我的函数列表在课堂上,那么对于那些善良的人们来说,还有一个问题 它有效吗? 问题答案: 当然,您可以按照FábioDiniz所说的:)进行操作,但是对于将类方法用作可调用对象时,必须将其作为参数提供给对象: 该对象必须作为可调用对象的参数提供,因为当您查看方法的定义时,该方法需要一个参数“ self ”