【问题标题】:debug created function using case_when in R在 R 中使用 case_when 调试创建的函数
【发布时间】:2023-01-05 22:57:13
【问题描述】:

从原始数据框:

  id  tru  wex  kjd
1 101    2    2    2
2 106    2    2 <NA>
3 107    0    0    0
4 110 <NA>    2    0
5 115    2    2    2
6 118    0 <NA>    0

想得到这个数据框:

  id  tru  wex  kjd tru_new wex_new kjd_new
1 101    2    2    2    GOOD    GOOD    GOOD
2 106    2    2 <NA>    GOOD    GOOD    <NA>
3 107    0    0    0     BAD     BAD     BAD
4 110 <NA>    2    0    <NA>    GOOD     BAD
5 115    2    2    2    GOOD    GOOD    GOOD
6 118    0 <NA>    0     BAD    <NA>     BAD

这是我的有效代码,但它是重复的:

id <- c("101", "106", "107", "110", "115", "118")
tru <- c("2", "2", "0", NA, "2", "0")
wex <- c("2", "2", "0", "2", "2", NA)
kjd <- c("2", NA, "0", "0", "2", "0")
dfname <- data.frame(id, tru, wex, kjd)

library(dplyr)
dfname <- dfname %>%  
      mutate(tru_new = case_when(!is.na(tru) & tru=="2" ~ "GOOD",
      !is.na(tru) & tru=="0" ~ "BAD",
      is.na(tru) ~ NA_character_))

dfname <- dfname %>%  
      mutate(wex_new = case_when(!is.na(wex) & wex=="2" ~ "GOOD",
      !is.na(wex) & wex=="0" ~ "BAD",
      is.na(wex) ~ NA_character_))

dfname <- dfname %>%  
      mutate(kjd_new = case_when(!is.na(kjd) & kjd=="2" ~ "GOOD",
      !is.na(kjd) & kjd=="0" ~ "BAD",
      is.na(kjd) ~ NA_character_))

但是我想让我自己的函数工作以更有效地编码。拜托,如果能以这种方式提供帮助,我将不胜感激,因为我正在学习创建函数和使用 case_when。

我的功能尝试就在这里。你能帮我让这个新功能工作吗?可能有一个我似乎无法解决的小问题。

library(dplyr)
new_cats <- function(var_old, var_new, df) {
  df <- df %>%  
      mutate(var_new = case_when(!is.na(var_old) & var_old=="2" ~ "GOOD",
      !is.na(var_old) & var_old=="0" ~ "BAD",
      is.na(var_old) ~ NA_character_))
  return(df)
}

dfname <- new_cats(tru, tru_new, dfname)
dfname <- new_cats(wex, wex_new, dfname)
dfname <- new_cats(kjd, kjd_new, dfname)

我创建的函数的错误结果:

  id  tru  wex  kjd var_new
1 101    2    2    2    GOOD
2 106    2    2 <NA>    <NA>
3 107    0    0    0     BAD
4 110 <NA>    2    0     BAD
5 115    2    2    2    GOOD
6 118    0 <NA>    0     BAD

【问题讨论】:

    标签: r dataframe function recode


    【解决方案1】:

    您可以使用acrossifelse 来完成:

    library(dplyr)
    dfname %>% 
      mutate(across(-id, ~ ifelse(.x == "2", "GOOD", "BAD"), 
                    .names = "{col}_new"))
    
    #    id  tru  wex  kjd tru_new wex_new kjd_new
    # 1 101    2    2    2    GOOD    GOOD    GOOD
    # 2 106    2    2 <NA>    GOOD    GOOD    <NA>
    # 3 107    0    0    0     BAD     BAD     BAD
    # 4 110 <NA>    2    0    <NA>    GOOD     BAD
    # 5 115    2    2    2    GOOD    GOOD    GOOD
    # 6 118    0 <NA>    0     BAD    <NA>     BAD
    

    或者使用case_whenacross

    dfname %>% 
      mutate(across(-id, 
                    ~ case_when(.x == "2" ~ "GOOD",
                                .x != "2" ~ "BAD"), 
                    .names = "{col}_new"))
    

    【讨论】:

    • 你能帮我让创建的函数正常工作吗?
    猜你喜欢
    • 1970-01-01
    • 2021-09-05
    • 2019-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 2019-08-25
    相关资源
    最近更新 更多