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"