R-使用与一个代码关联的多个文本值对列进行重新编码
我正试图重新编码一列以确定员工的班次 数据很混乱,我要找的单词必须从文本中提取出来。我一直在尝试使用R-使用与一个代码关联的多个文本值对列进行重新编码,r,case-sensitive,stringr,recode,R,Case Sensitive,Stringr,Recode,我正试图重新编码一列以确定员工的班次 数据很混乱,我要找的单词必须从文本中提取出来。我一直在尝试使用if语句、stringr和dplyr包的各种方法,但不知道如何让它们协同工作 我有这行代码,但str_match不会生成真/假值 Data$Shift <- if(str_match(Data$Unit, regex(first, ignore_case = TRUE))) { print("First Shift") } else { print("Lame") }
if
语句、stringr
和dplyr
包的各种方法,但不知道如何让它们协同工作
我有这行代码,但str_match不会生成真/假值
Data$Shift <- if(str_match(Data$Unit, regex(first, ignore_case = TRUE))) {
print("First Shift")
} else {
print("Lame")
}
我建议在
dplyr
中使用grepl
和case\u
library(dplyr)
Data %>%
mutate(Shift = case_when(grepl("first|1st", Unit, ignore.case = TRUE) ~ "First Shift",
grepl("third|3rd", Unit, ignore.case = TRUE) ~ "Third Shift",
TRUE ~ "Neither"))
mutate
创建我们的新列Shift
grepl
如果逻辑向量与模式匹配与否,则返回逻辑向量。在本例中,我使用的模式是“first | 1st”
。|
字符表示或,即检查“first”或“1st”
case\u when
的工作方式类似于多个“if”语句,允许我们将逻辑保持在一起(类似于SQL语法)。case\u的最后一行是我们这里的安全网……如果Unit
的值不包含第1或第3班次,它将返回“两者都不”,因此我们知道需要进一步调查
如果您没有最新版本的dplyr
(>0.7.3
),则case\u when
可能不适合您。如果是这样,我们可以用嵌套的ifelse
链替换case\u when
Data %>%
mutate(Shift = ifelse(grepl("first|1st", Unit, ignore.case = TRUE),
"First Shift",
ifelse(grepl("third|3rd", Unit, ignore.case = TRUE),
"Third Shift",
"Neither")))
没有那么漂亮,但应该是相同的结果,因为我们在grepl
中使用的模式是相互排斥的。保持简单:
Data$shift[grepl("3rd", Data$shift)] <- "Third Shift"
Data$shift[grepl("1st", Data$shift)] <- "First Shift"
Data$shift[grepl(“3rd”,Data$shift)]如果要在Data$shift中输入值,则不希望使用print
。您还应该在此处使用ifelse
而不是if
stringr
可能有些过火了,为什么不只是像Data$shift[grepl(“3rd”,Data$shift)]这样的几个语句呢?谢谢!这正是我需要的。刚从100个唯一值变为6。仅供参考,str\u match
不会返回真/假,但是str\u detect
感谢您!我试过运行它,但出于某种原因,除非指定了Data$Unit,否则它不会读取“Unit”所在的列。修复后,它运行时不会出错,但不会生成Shift列。软件包已安装。有什么我可能遗漏的吗?哦,这可能是您正在使用的dplyr
包版本的问题<代码>packageVersion(“dplyr”)
对我来说是0.7.4
。我相信当0.7.3版中提供了case\u时。还有,Data
是数据帧吗?好的,可能就是这样。我有0.5.0,即使在更新之后也是如此。软件包数据是数据。框架我将为较旧的dplyr
版本添加一个选项谢谢!无论出于何种原因,我必须在上面的部分之前添加'Data1='以将新列包含在新的数据集中,但在其他方面效果很好。
Data %>%
mutate(Shift = ifelse(grepl("first|1st", Unit, ignore.case = TRUE),
"First Shift",
ifelse(grepl("third|3rd", Unit, ignore.case = TRUE),
"Third Shift",
"Neither")))
Data$shift[grepl("3rd", Data$shift)] <- "Third Shift"
Data$shift[grepl("1st", Data$shift)] <- "First Shift"