我有一个类似于:
的数据框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)
非常感谢任何帮助。
答案 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。