`na_if()` 中的错误:!无法将 `y` <character> 转换为匹配 `x` <double> 的类型

Sop*_*010 4 r mutate

我有一个数据帧 df_3 ,我想从中改变以Team_开头的多个列。我想用 NA 替换列中包含的 0。我使用以前成功使用过的代码,但现在出现以下错误:

\n
Error in `mutate()`:\n\xe2\x84\xb9 In argument: `across(starts_with("Team_"), ~na_if(., "0"))`.\nCaused by error in `across()`:\n! Can't compute column `Team_Num_1`.\nCaused by error in `na_if()`:\n! Can't convert `y` <character> to match type of `x` <double>.\nBacktrace:\n  1. df_3 %>% mutate(across(starts_with("Team_"), ~na_if(., "0")))\n 10. dplyr::na_if(Team_Num_1, "0")\n
Run Code Online (Sandbox Code Playgroud)\n

知道为什么会这样或者我该如何解决它吗?我没有更改原始 df 中的任何内容以及之前运行的代码,不确定发生了什么变化。

\n

可复制代码:

\n
structure(list(Team_1 = c("0", "werg", "sdf"), Team_Desc_1 = c("wer", \n"wtrb", "wergt"), Team_URL_1 = c("ewrg", "werg", "asd"), Team_Ver_1 = c("25", \n"2523", "342"), Team_Num_1 = c(0, 23, 12), Team_Value_1 = c("aed", \n"jfsa", "vsf"), Name_1 = c("etwbv", "werg", "sdfg"), Txt_1 = c("abc", \n"bfh", "fse"), Head_1 = c("abc1", "bfh", "fse"), Team_2 = c("werh", \n"wtt", "qwe"), Team_Desc_2 = c("sdfg", "wer", "sdfgv"), Team_URL_2 = c("qwe", \n"gvre", "vrw"), Team_Ver_2 = c("4123", "5133", "4126"), Team_Num_2 = c(3, \n0, 123), Team_Value_2 = c("aewed", "jfsbwa", "vsbf"), Name_2 = c("qwreg", \n"gvr", "wref"), Txt_2 = c("rege", "wer", "vwr"), Head_2 = c("rege1", \n"wer", "vwr")), row.names = c(NA, -3L), class = c("tbl_df", "tbl", \n"data.frame"))\n
Run Code Online (Sandbox Code Playgroud)\n

zep*_*ryl 9

根据dplyr 1.1.0 的变更日志na_if(),现在使用 vctrs 包,该包对类型稳定性更加严格:

\n
\n

na_if()( #6329 ) 现在转换y为比较之前的类型x,这使得该函数在 上的类型和大小稳定x

\n
\n

因此,请使用na_if(x, "0")

\n
library(dplyr)\n\ndat %>%\n  mutate(across(starts_with("Team_"), ~ na_if(.x, "0")))\n# # A tibble: 3 \xc3\x97 18\n#   Team_1 Team_Desc_1 Team_UR\xe2\x80\xa6\xc2\xb9 Team_\xe2\x80\xa6\xc2\xb2 Team_\xe2\x80\xa6\xc2\xb3 Team_\xe2\x80\xa6\xe2\x81\xb4 Name_1 Txt_1 Head_1 Team_2\n#   <chr>  <chr>       <chr>     <chr>   <chr>   <chr>   <chr>  <chr> <chr>  <chr> \n# 1 NA     wer         ewrg      25      aed     aed     etwbv  abc   abc1   werh  \n# 2 werg   wtrb        werg      2523    jfsa    jfsa    werg   bfh   bfh    wtt   \n# 3 sdf    wergt       asd       342     vsf     vsf     sdfg   fse   fse    qwe   \n# # \xe2\x80\xa6 with 8 more variables: Team_Desc_2 <chr>, Team_URL_2 <chr>,\n# #   Team_Ver_2 <chr>, Team_Num_2 <chr>, Team_Value_2 <chr>, Name_2 <chr>,\n# #   Txt_2 <chr>, Head_2 <chr>, and abbreviated variable names \xc2\xb9\xe2\x80\x8bTeam_URL_1,\n# #   \xc2\xb2\xe2\x80\x8bTeam_Ver_1, \xc2\xb3\xe2\x80\x8bTeam_Num_1, \xe2\x81\xb4\xe2\x80\x8bTeam_Value_1\n
Run Code Online (Sandbox Code Playgroud)\n

如果您混合使用字符和数字列,您可以这样做:

\n
dat2 <- tibble(\n  Team_1 = c("0", "werg", "sdf"), \n  Team_Desc_1 = c(0, 3, 4), \n  Name_1 = c("etwbv", "werg", "sdfg")\n)\n\ndat2 %>% \n  mutate(\n    across(starts_with("Team_") & where(is.character), ~ na_if(.x, "0")),\n    across(starts_with("Team_") & where(is.numeric), ~ na_if(.x, 0)),\n  )\n# # A tibble: 3 \xc3\x97 3\n#   Team_1 Team_Desc_1 Name_1\n#   <chr>        <dbl> <chr> \n# 1 NA              NA etwbv \n# 2 werg             3 werg  \n# 3 sdf              4 sdfg \n
Run Code Online (Sandbox Code Playgroud)\n