r - 一行中的文本的多个 case_when
问题描述
数据
我有一个数据框如下:
structure(list(EndoscopyEventRaw = c("", "", "oesophagus:rfa;oesophagus:nac",
"oesophagus:rfa;oesophagus:nac", "oesophagus:brushings", "oesophagus:rfa;oesophagus:emr;oesophagus:nac",
"oesophagus:apc", "oesophagus:apc;oesophagus:nac", "oesophagus:apc",
"")), row.names = c(NA, 10L), class = "data.frame")
目标
我想将这方面的内容提取到一个新列中,可能case_when
基于以下规则使用:
dataframe<-dataframe %>% mutate(OPCS4ZCode2 = case_when(
grepl("nac",EndoscopyEventRaw)~ "CodeForNAC",
grepl("apc",EndoscopyEventRaw) ~ "CodeForAPC",
grepl("rfa",EndoscopyEventRaw) ~ "CodeForRFA",
grepl("grasp",EndoscopyEventRaw) ~ "CodeForGrasp"
),
TRUE ~ ""
)
问题和预期结果
但是,有些行有多个元素,这些代码被编码到新列中,因此最终结果应该是:
1
2
3 CodeForRFA,CodeForNAC
4 CodeForRFA,CodeForNAC
5
6 CodeForRFA,CodeForNAC
7 CodeForAPC
8 CodeForAPC,CodeForNAC
9 CodeForAPC
10
当我使用case_when
它时,它会在找到第一个匹配项时停止查找。有没有一种方法可以使用或不使用匹配上述所有目标case_when
?
解决方案
是的,case_when
一旦找到匹配项,就会跳过其他条件。一种方法是将数据分成不同的行,然后使用条件case_when
并汇总数据。
library(dplyr)
df %>%
mutate(row = row_number()) %>%
tidyr::separate_rows(EndoscopyEventRaw, sep = ";") %>%
mutate(OPCS4ZCode2 = case_when(grepl("nac",EndoscopyEventRaw)~ "CodeForNAC",
grepl("apc",EndoscopyEventRaw) ~ "CodeForAPC",
grepl("rfa",EndoscopyEventRaw) ~ "CodeForRFA",
grepl("grasp",EndoscopyEventRaw) ~ "CodeForGrasp",
TRUE ~ "")) %>%
group_by(row) %>%
summarise(OPCS4ZCode2 = toString(OPCS4ZCode2)) %>%
select(-row)
# A tibble: 10 x 1
# OPCS4ZCode2
# <chr>
# 1 ""
# 2 ""
# 3 CodeForRFA, CodeForNAC
# 4 CodeForRFA, CodeForNAC
# 5 ""
# 6 CodeForRFA, , CodeForNAC
# 7 CodeForAPC
# 8 CodeForAPC, CodeForNAC
# 9 CodeForAPC
#10 ""
推荐阅读
- c++ - 为什么标准关联有序容器允许 `const char*` 作为它们的键?
- android - 使用 livedata 获取 RecyclerView 的 ClickListener 时间
- windows - 有没有办法通过 Windows 命令观察文件的“可用性状态”?
- r - 如何在列表中保存多个饼图?
- oracle - Ora 在插入表时出现无效月份错误
- python - 在 tkinter 中创建事件之间的关系
- react-native - 单击时无法展开和关闭可折叠
- node.js - Sass 加载程序错误:与 API 架构不匹配的无效选项对象
- cloud - PaaS 服务管理器有替代品吗?
- selenium - 如何修复硒中的“部分链接类名称查找”