gpt4 book ai didi

r - 将 `mutate_at` 和 `na_if` 一起使用,仅对某些列将零替换为 NA

转载 作者:行者123 更新时间:2023-12-02 00:57:13 26 4
gpt4 key购买 nike

我的数据采用以下格式:

library(tidyverse)
df <- mtcars
df <- df %>% mutate(vs_doubled = vs * 2) %>% select(mpg, cyl, vs, am, vs_doubled)

head(df)


#> mpg cyl vs am vs_doubled
#> 1 21.0 6 0 1 0
#> 2 21.0 6 0 1 0
#> 3 22.8 4 1 1 2
#> 4 21.4 6 1 0 2
#> 5 18.7 8 0 0 0
#> 6 18.1 6 1 0 2

我尝试使用 mutate_atna_if 将 0 值设置为 NA,但仅限于特定列(“vs”和“am”)。我想将“vs_doubled”列保留为零。

我不太明白,因为下面的行不起作用:

df <- df %>% mutate_at(.vars = c("vs", "am"), .funs = na_if(y = 0))

最佳答案

更新

dplyr 1.0.0开始,我们可以使用across:

library(dplyr)
df %>% mutate(across(c(vs,am), na_if, 0)) %>% head

# mpg cyl vs am vs_doubled
#1 21.0 6 NA 1 0
#2 21.0 6 NA 1 0
#3 22.8 4 1 1 2
#4 21.4 6 1 NA 2
#5 18.7 8 NA NA 0
#6 18.1 6 1 NA 2
<小时/>

原始答案

在之前版本的dplyr中,我们可以使用mutate_at:

df %>%  mutate_at(vars(vs,am), ~na_if(.,0)) %>% head

或者另一种方式是

df %>% mutate_at(vars(vs,am), na_if, 0)

~ 是 purrr 样式的公式语法,而 . 表示列的值。它是匿名函数调用的替代方案,您可以将上述函数编写为

df %>%  mutate_at(vars(vs,am), function(x) na_if(x, 0)) 

此外,所示的替代方法不需要 ~,我们可以直接传递带有附加参数的函数(这里 y 为 0)。

<小时/>

当然,还有其他方法可以在不使用 na_if 的情况下实现此目的

df %>% mutate_at(vars(vs, am), ~replace(., . == 0, NA)) 

或与基本 R 相同

cols <- c("vs", "am")
df[cols] <- lapply(df[cols], function(x) replace(x, x == 0, NA))

关于r - 将 `mutate_at` 和 `na_if` 一起使用,仅对某些列将零替换为 NA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56928827/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com