我有一个数据帧 df_3 ,我想从中改变以Team_开头的多个列。我想用 NA 替换列中包含的 0。我使用以前成功使用过的代码,但现在出现以下错误:
\nError 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")\nRun Code Online (Sandbox Code Playgroud)\n知道为什么会这样或者我该如何解决它吗?我没有更改原始 df 中的任何内容以及之前运行的代码,不确定发生了什么变化。
\n可复制代码:
\nstructure(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"))\nRun Code Online (Sandbox Code Playgroud)\n
根据dplyr 1.1.0 的变更日志na_if(),现在使用 vctrs 包,该包对类型稳定性更加严格:
\n\n\n
na_if()( #6329 ) 现在转换y为比较之前的类型x,这使得该函数在 上的类型和大小稳定x。
因此,请使用na_if(x, "0"):
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\nRun Code Online (Sandbox Code Playgroud)\n如果您混合使用字符和数字列,您可以这样做:
\ndat2 <- 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 \nRun Code Online (Sandbox Code Playgroud)\n