如何在 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" 

如果您没有得到想要的结果,这可能与您的数据结构方式或您应用代码的方式有关。