如何在 R 中组合多个 ifelse 函数?
How to combine several ifelse functions in R?
我对 R 中几个 ifelse 函数的组合有疑问。尝试 运行 下一行时,我得到的结果只有 "Other"。
standardized_object_codes <- ifelse(Spending_1$OBJECT_CODE %in% c("GG"), "Grants",
ifelse(Spending_1$OBJECT_CODE %in% c("SW"),"Salaries and Wages",
ifelse(Spending_1$OBJECT_CODE %in% c("DR"), "Retirement",
ifelse(Spending_1$OBJECT_CODE %in% c("DO"), "Nonretirement",
ifelse(Spending_1$OBJECT_CODE %in% c("PC"), "Contracts", "Other")))))
这绝对不正常,因为我的数据包含上面函数中列出的所有目标代码(GG、SW、DR、DO 和 PC)。你能帮我解决我做错了什么吗?
非常感谢!
作为我上面评论的后续,你可以试试
standardized_object_codes <- with(Spending_1, dplyr::case_when(
OBJECT_CODE == "GG" ~ "Grant",
OBJECT_CODE == "SW" ~ "Salaries and Wages",
OBJECT_CODE == "DR" ~ "Retirement",
OBJECT_CODE == "DO" ~ "Nonretirement",
OBJECT_CODE == "PC" ~ "Contracts",
TRUE ~ "Other"))
或者创建一个查找 table 并使用 match
来匹配条目。
df.lookup <- data.frame(
OBJECT_CODE = c("GG", "SW", "DR", "DO", "PC"),
Description = c("Grant", "Salaries and Wages", "Retirement", "Nonretirement", "Contracts"),
stringsAsFactors = F)
standardized_object_codes <- replace(
x <- df.lookup$Description[match(Spending_1$OBJECT_CODE, df.lookup$OBJECT_CODE)],
is.na(x), "Other")
您可以使用因子标签:
lev = c("GG", "SW", "DR", "DO", "PC","others")
lab = c("Grant", "Salaries and Wages", "Retirement", "Nonretirement", "Contracts","others")
#Now change everything not in lev to "others"
newf = ifelse(Spending_1$OBJECT_CODE %in% lev, Spending_1$OBJECT_CODE, "others")
as.character(factor(newf, lev, lab)) #change all names at once
当在数据框中提供矢量时,您的代码似乎可以正常工作。
> Spending_1 <- data.frame(OBJECT_CODE = c("GG", "SW", "DR", "DO", "PC", "Other"))
> standardized_object_codes <- ifelse(Spending_1$OBJECT_CODE %in% c("GG"), "Grants",
ifelse(Spending_1$OBJECT_CODE %in% c("SW"),"Salaries and Wages",
ifelse(Spending_1$OBJECT_CODE %in% c("DR"), "Retirement",
ifelse(Spending_1$OBJECT_CODE %in% c("DO"), "Nonretirement",
ifelse(Spending_1$OBJECT_CODE %in% c("PC"), "Contracts", "Other")))))
> standardized_object_codes
[1] "Grants" "Salaries and Wages" "Retirement"
[4] "Nonretirement" "Contracts" "Other"
如果您没有得到想要的结果,这可能与您的数据结构方式或您应用代码的方式有关。
我对 R 中几个 ifelse 函数的组合有疑问。尝试 运行 下一行时,我得到的结果只有 "Other"。
standardized_object_codes <- ifelse(Spending_1$OBJECT_CODE %in% c("GG"), "Grants",
ifelse(Spending_1$OBJECT_CODE %in% c("SW"),"Salaries and Wages",
ifelse(Spending_1$OBJECT_CODE %in% c("DR"), "Retirement",
ifelse(Spending_1$OBJECT_CODE %in% c("DO"), "Nonretirement",
ifelse(Spending_1$OBJECT_CODE %in% c("PC"), "Contracts", "Other")))))
这绝对不正常,因为我的数据包含上面函数中列出的所有目标代码(GG、SW、DR、DO 和 PC)。你能帮我解决我做错了什么吗?
非常感谢!
作为我上面评论的后续,你可以试试
standardized_object_codes <- with(Spending_1, dplyr::case_when(
OBJECT_CODE == "GG" ~ "Grant",
OBJECT_CODE == "SW" ~ "Salaries and Wages",
OBJECT_CODE == "DR" ~ "Retirement",
OBJECT_CODE == "DO" ~ "Nonretirement",
OBJECT_CODE == "PC" ~ "Contracts",
TRUE ~ "Other"))
或者创建一个查找 table 并使用 match
来匹配条目。
df.lookup <- data.frame(
OBJECT_CODE = c("GG", "SW", "DR", "DO", "PC"),
Description = c("Grant", "Salaries and Wages", "Retirement", "Nonretirement", "Contracts"),
stringsAsFactors = F)
standardized_object_codes <- replace(
x <- df.lookup$Description[match(Spending_1$OBJECT_CODE, df.lookup$OBJECT_CODE)],
is.na(x), "Other")
您可以使用因子标签:
lev = c("GG", "SW", "DR", "DO", "PC","others")
lab = c("Grant", "Salaries and Wages", "Retirement", "Nonretirement", "Contracts","others")
#Now change everything not in lev to "others"
newf = ifelse(Spending_1$OBJECT_CODE %in% lev, Spending_1$OBJECT_CODE, "others")
as.character(factor(newf, lev, lab)) #change all names at once
当在数据框中提供矢量时,您的代码似乎可以正常工作。
> Spending_1 <- data.frame(OBJECT_CODE = c("GG", "SW", "DR", "DO", "PC", "Other"))
> standardized_object_codes <- ifelse(Spending_1$OBJECT_CODE %in% c("GG"), "Grants",
ifelse(Spending_1$OBJECT_CODE %in% c("SW"),"Salaries and Wages",
ifelse(Spending_1$OBJECT_CODE %in% c("DR"), "Retirement",
ifelse(Spending_1$OBJECT_CODE %in% c("DO"), "Nonretirement",
ifelse(Spending_1$OBJECT_CODE %in% c("PC"), "Contracts", "Other")))))
> standardized_object_codes
[1] "Grants" "Salaries and Wages" "Retirement"
[4] "Nonretirement" "Contracts" "Other"
如果您没有得到想要的结果,这可能与您的数据结构方式或您应用代码的方式有关。