【发布时间】:2022-01-15 12:37:33
【问题描述】:
这似乎是一个相当简单的任务,但是在研究了ifelse()、dplyr::if_else() 的文档以及关于 SO 上关于将ifelse() 应用于数据框中的多个列的几个类似帖子之后,我无法弄清楚.
我的目标:我有以下数据框,其中包含不同数据类型的列。在每一行上,如果列“有效”表示错误,我想将前 3 列中的值重置为 NA。
问题:我使用dplyr::across()和ifelse()来改变我想要的值,但是日期列date和因子列team被强制转换为数字(如图在下面的代表中),这是不可取的。我知道dplyr::if_else() 保留了数据类型,但它也不适用于不同数据类型的列。
我知道tdf[tdf$valid == FALSE, !grepl("valid", names(tdf))] <- NA 可以实现我的目标,但我更喜欢 tidyverse 方法,我可以在我的数据清理管道中使用它。非常感谢!
library(dplyr)
tdf <- tibble(
date = c(as.Date("2021-12-10"), as.Date("2021-12-11")),
team = factor(1:2, labels = c("T1", "T2")),
score = 3:4,
valid = c(TRUE, FALSE)
)
tdf
#> # A tibble: 2 x 4
#> date team score valid
#> <date> <fct> <int> <lgl>
#> 1 2021-12-10 T1 3 TRUE
#> 2 2021-12-11 T2 4 FALSE
tdf %>% mutate(across(-valid, ~ ifelse(valid, ., NA)))
#> # A tibble: 2 x 4
#> date team score valid
#> <dbl> <int> <int> <lgl>
#> 1 18971 1 3 TRUE
#> 2 NA NA NA FALSE
由reprex package (v2.0.1) 于 2021 年 12 月 10 日创建
【问题讨论】:
标签: r if-statement dplyr across