链接ifelse与mutate不工作

时间:2016-08-12 09:22:39

标签: r grep dplyr

我有一个类似于:

的数据框
placeID <- c(001, 002, 003, 004, 005)
faultDscr <- c("6940 broken", "6122 not working", "6122 broken", "6940 not working", "printer not working")
partID <- c("PTR-HP-6940", NA, "PTR-HP-6122", NA, NA)
myData <- data.frame(placeID, faultDscr, partID)

我想创建一个新变量,以确定某个网站是否使用6122喷墨打印机作为我的dplyr管道的一部分。新变量应包含Y或N.我使用了以下代码:

library(dplyr)
inkjetSites <- myData %>%
mutate(inkjetSite = ifelse(partID == "PTR-HP-6122", "Y",
                             ifelse(is.na(partID) && grep("6122", faultDscr), "Y", "N")))

我希望获得如下输出:

inkjetSite <- c("N", "Y", "Y", "N", "N")
inkjetSitesCor <- data.frame(placeID, faultDscr, partID, inkjetSite)

但是我得到的输出如下:

inkjetSite <- c("N", NA, "Y", NA, NA)
inkjetSitesInCor <- data.frame(placeID, faultDscr, partID, inkjetSite)

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

我们可以尝试使用%in%并删除==,因为NA会在那里保持为NA(除非我们创建& !is.na(partID)),将&&更改为{{ 1}}并且也从&更改为grep(用于逻辑矢量输出)

grepl

这也可以在没有myData %>% mutate(inkjetSite = ifelse(partID %in% "PTR-HP-6122", "Y", ifelse(is.na(partID) & grepl("6122", faultDscr), "Y", "N"))) # placeID faultDscr partID inkjetSite #1 1 6940 broken PTR-HP-6940 N #2 2 6122 not working <NA> Y #3 3 6122 broken PTR-HP-6122 Y #4 4 6940 not working <NA> N #5 5 printer not working <NA> N

的情况下完成
ifelse

答案 1 :(得分:0)

我建议使用case_when

mutate(inkjetSite = case_when(is.na(partID) ~ 'N',
                                                  partID == "PTR-HP-6122" ~ "Y",
                                                  grepl('6122', faultDscr) ~ 'Y', 
                                                  TRUE ~ 'N'))

在检查其ID之前,您应该先测试partID是否为NA。