使用 mutate、case_when、cross 和 string detector 评估多列中的模式以创建新列

问题描述 投票:0回答:1

我想根据多个列的评估创建一个新列。我正在搜索 ICD10 代码,并希望当一列或多列中存在适当的模式时创建一个标志。具体来说,我想搜索任何第 5 个字符为 2 的 ICD 代码 T36-T50(例如 T3602)。

这是一个代表。

df <- data.frame (dx1 = c('K5039','T215','C219861','T36002'),
                  dx2 = c('T38022','X72001','X55124','T36022'),
                  dx3 = c('X80011','X790122','X55124','T36022'),
                  pcode = c('R41','R44','R98','R99'),
                  ecode = c('X79','X81012','X44015','X83012'),
                  stringsAsFactors = FALSE)

df_new <- df %>% 
  mutate(injury = case_when(
    across(c(dx1:dx3, ecode),
           ~str_detect(.,regex('(T36|T37|T38|T39|T40|T41|T42|T43|T44|
                                  T45|T46|T47|T48|T49|T50)[:graph:]{1}2.*'))        ~ 1,
    TRUE                                                   ~ 0)))
    

我收到错误消息

mutate()
中的错误: ℹ 在争论中:
injury = case_when(...)
。 由
across()
中的错误引起: !无法将双面公式
.fns
转换为函数。

我可以使用 if_any 让它部分工作,如下所示:

df_new <- df %>% 
  mutate(injury = case_when(
    if_any(c(dx1:dx3, ecode),
           ~str_detect(.,regex('X72|X73|X74|X75')))        ~ 1,
    TRUE                                                   ~ 0))

但是当我添加代码来选择第五个字符时,我收到了类似的错误。

mutate()
中的错误: ℹ 在争论中:
injury = case_when(...)
。 由
if_any()
中的错误引起: !无法将双面公式
.fns
转换为函数。 运行
rlang::last_trace()
查看错误发生的位置。

这就是我希望输出的样子。

table of correctly evaluated ICD10 codes

r case mutate across
1个回答
0
投票

我认为这只是一个语法错误,

df_new <- df %>% 
  mutate(injury = case_when(
    if_any(c(dx1:dx3, ecode),
           ~str_detect(.,regex('(T36|T37|T38|T39|T40|T41|T42|T43|T44|
                                  T45|T46|T47|T48|T49|T50)[:graph:]{1}2.*'))) ~ 1,
           TRUE ~ 0))

对我有用。注意“...{1}2.*'”后面的 3 个右括号而不是 2

© www.soinside.com 2019 - 2024. All rights reserved.