如何在R中组合几个ifelse函数?

时间:2018-07-24 01:32:30

标签: r if-statement conditional

我对R中的多个ifelse函数的组合有疑问。尝试运行以下行时,我得到的结果仅为“其他”。

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)中列出的所有目标代码。您能帮我解决我做错的事情吗?

非常感谢!

3 个答案:

答案 0 :(得分:0)

作为我上面评论的后续内容,您可以尝试

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"))

或者创建一个查找表,然后使用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")

答案 1 :(得分:0)

您可以使用因子标签:

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

答案 2 :(得分:0)

在数据框中提供矢量时,您的代码似乎可以正常工作。

> 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" 

如果没有获得所需的结果,则可能与数据的结构方式或代码的应用方式有关。