【发布时间】:2019-06-13 21:08:24
【问题描述】:
我有一个数据集,其中包含大量表示程序代码的字符串列变量。还有另一列变量表示编码格式(有些是 ICD9,有些是其他更神秘的格式)。每个观察都是一个病人。我需要:
- 使用特定前缀搜索每个变量名称
- 确保使用的代码是 ICD9 代码(用“02”表示)。
- 找出哪些代码与特定字符串的前 3 个字符匹配
- 如果任何变量以这三个字符开头,则创建一个新列变量 =1,如果不匹配则 =0
变量太多了,通过 c("cd1", "cd2", ...) 手动创建每个变量的列表是微不足道的,而且我可能需要多次执行此操作,所以我'想让它成为一个尽可能通用的解决方案。
这是一个简化的示例,我需要搜索的字符串以“231”开头:
ID cd1 type1 cd2 type2 cd3 type3 cd4 type4
1 "231" "02" "219" "02" "1321" "02" "2314" "02"
2 "222" "02"
3 "123" "142"
4 "145" "02" "521" "02" "2313" "02"
5 "231" "01"
我想要的输出是:
ID cd1 type1 cd2 type2 cd3 type3 cd4 type4 flag_var
1 "231" "02" "219" "02" "1321" "02" "2314" "02" 1
2 "222" "02" 0
3 "123" "142" 0
4 "145" "02" "521" "02" "2313" "02" 1
5 "231" "01" 0
(ID #5 设置为 0,因为即使 cd1 代码是“231”,type1 变量也是“01”,因此编码格式不正确”)
我在使用 mutate 和 case_when 实现这一点方面取得了一定的成功:
df <- df %>%
mutate(flag_var = case_when(
startsWith(cd1, "231") ~ 1,
startsWith(cd2, "231") ~ 1,
startsWith(cd3, "231") ~ 1,
startsWith(cd4, "231") ~ 1,
TRUE ~ 0))
就像我说的那样,实际的数据集有太多的变量和潜在的搜索,因此以上述方式对其进行硬编码是有意义的。我认为应该有一种使用 mutate_at 或其他 dplyr 函数的好方法,但我无法弄清楚。
我已经能够使用以下代码获得一组等于 1 或 0 的新变量,但不是单个变量。然后我可以使用 rowSums 对所有列求和,并检查该值是否为非零。但它又丑又费力:
df <- df %>% mutate_at(vars(starts_with("cd")),
funs(testvar = ifelse(startsWith(., "231"), 1, 0)))
test_names = df %>% select(ends_with("_testvar")) %>% names()
df <- df %>% mutate(flag_var = (rowSums(.[test_names]) == 1))
df <- df %>% select(-ends_with("_testvar"))
有人有更简单的想法吗?非常感谢!
编辑:我意识到我还必须合并编码类型变量。最初的样本数据表已经过编辑以反映这一点。
【问题讨论】:
-
这绝对超出了我的 CRAN 'icd' 包,而 'dplyr' 是完成这项工作的好工具;只是提醒一下,“icd”可能有助于您可能需要的预处理、代码验证和更复杂的合并症计算。