mutate_at with all_of()in r?

p3rjfoxz  于 2023-07-31  发布在  其他
关注(0)|答案(2)|浏览(90)

尝试在这里验证一些代码的未来。我无法理解以下警告信息:

snpdata <- snpdata %>%
  mutate_at(vars(snpcol_start:snpcol_end),
            list(~ ifelse(. == 0, "AA", ifelse(. == 1, "AB", .))))

字符串
警告消息:1:在选择中使用外部向量在tidyselect >1.1.0中被弃用。请使用all_of()any_of()

Was:data %>% select(snpcol_start)

现在:data %>% select(all_of(snpcol_start))

请参阅https://tidyselect.r-lib.org/reference/faq-external-vector.html。此警告每8小时显示一次。
调用lifecycle::last_lifecycle_warnings()查看此警告是在何处生成的。2:在选择中使用外部向量在tidyselect 1.1.0中被弃用。请使用all_of()any_of()

Was:data %>% select(snpcol_end)

现在:data %>% select(all_of(snpcol_end))

参见https://tidyselect.r-lib.org/reference/faq-external-vector.html。此警告每8小时显示一次。调用lifecycle::last_lifecycle_warnings()查看此警告是在何处生成的。
请帮帮忙,我是新来的

brgchamk

brgchamk1#

这里有一个使用across而不是all_of的解决方案。

suppressPackageStartupMessages(
  library(dplyr)
)

set.seed(2023)
snpdata <- replicate(3, rbinom(5, 1, 0.5)) %>%
  as.data.frame() %>%
  `names<-`(paste("snpcol", c("start", "mid", "end"), sep = "_"))

snpdata %>%
  mutate_at(vars(snpcol_start:snpcol_end),
            list(~ ifelse(. == 0, "AA", ifelse(. == 1, "AB", .))))
#>   snpcol_start snpcol_mid snpcol_end
#> 1           AA         AA         AB
#> 2           AA         AA         AA
#> 3           AA         AB         AA
#> 4           AA         AA         AB
#> 5           AA         AA         AB

snpdata %>%
  mutate(across(snpcol_start:snpcol_end,
                ~ ifelse(. == 0, "AA", ifelse(. == 1, "AB", .))))
#>   snpcol_start snpcol_mid snpcol_end
#> 1           AA         AA         AB
#> 2           AA         AA         AA
#> 3           AA         AB         AA
#> 4           AA         AA         AB
#> 5           AA         AA         AB

字符串
创建于2023-07-25带有reprex v2.0.2
across/case_when解决方案

snpdata %>%
  mutate(across(snpcol_start:snpcol_end,
                ~ case_when(
                  . == 0 ~ "AA",
                  . == 1 ~ "BB",
                  TRUE ~ as.character(.)
                )))
#>   snpcol_start snpcol_mid snpcol_end
#> 1           AA         AA         BB
#> 2           AA         AA         AA
#> 3           AA         BB         AA
#> 4           AA         AA         BB
#> 5           AA         AA         BB


创建于2023-07-25带有reprex v2.0.2

jxct1oxe

jxct1oxe2#

新的语法如下:

# sample data
snpdata <- tibble(
    snpcol_start = c(1, 0, 1),
    snpcol_end = c(0, 1, 0)
)

snpdata %>%
  mutate(across(snpcol_start:snpcol_end, \(x) ifelse(x == 0, "AA", ifelse(x == 1, "AB", x))))

字符串
我已经将匿名函数的波浪号语法替换为R4.1中引入的\(x)语法。如果你想让事情更简洁(和可读),你也可以用case_when替换嵌套的ifelse

snpdata %>%
  mutate(across(snpcol_start:snpcol_end, \(x) case_when(
    x == 0 ~ "AA",
    x == 1 ~ "AB",
    TRUE ~ as.character(x)
  )))

相关问题