我想使用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()函数中使用列
为了补充之前的回答,如果您想添加新变量(而不是替换),如原始问题中的名称,如z_1和y_1,则只需:
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创建新变量,同时保留原始变量
这是由@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 ”