【发布时间】: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