【发布时间】:2017-06-14 16:57:57
【问题描述】:
我需要从字符(字符串)变量创建一个虚拟变量(二进制) 我的数据如下所示:
dat <- tribble(
~pat_id, ~icd9_1, ~icd9_2,
1, "414.01", "414.01",
2, "411.89", NA,
3, NA, "410.71",
4, NA, NA,
5, NA, "410.51",
6, NA, "272.0, 410.71"
)
dat
# A tibble: 6 x 3
# pat_id icd9_1 icd9_2
# <dbl> <chr> <chr>
# 1 414.01 414.01
# 2 411.89 <NA>
# 3 <NA> 410.71
# 4 <NA> <NA>
# 5 <NA> 410.51
# 6 <NA> 272.0, 410.71
我要新建三个二进制变量:
icd9_bin_1 == icd9_1 的二进制 (0/1)icd9_bin_2 == icd9_2 的二进制 (0/1)icd9_bin == icd9_1 的二进制或icd9_2
创建这些二进制变量的最快方法是什么?
我已经用0 替换了NAs,变成了一个因子然后重新编码,但是那
永远。
# get structure
dat$icd9_1 %>% str()
# get rid of NAs (replace with 0s)
dat$icd9_1[is.na(dat$icd9_1 )] <- 0
# turn into factor
dat$icd9_1 <- factor(dat$icd9_1)
# get levels
dat$icd9_1 %>% levels()
# use fct_collapse
dat %>%
mutate(icd9_bin_1 = fct_collapse(
icd9_1,
`icd9` = c("411.89","414.01"),
`no icd9 dx` = c("0")))
# A tibble: 6 x 4
# pat_id icd9_1 icd9_2 icd9_bin_1
# <dbl> <fctr> <chr> <fctr>
# 1 414.01 414.01 icd9
# 2 411.89 <NA> icd9
# 3 0 410.71 no icd9 dx
# 4 0 <NA> no icd9 dx
# 5 0 410.51 no icd9 dx
# 6 0 272.0, 410.71 no icd9 dx
我正在寻找更优雅的解决方案。想法?
【问题讨论】:
-
第一行应该是二进制文件,因为它有两个非 na 列。您已将其标记为与仅指示列
9_1的第二行相同。 -
你只需要
dat$icd9_bin_1 <- if_else(is.na(dat$icd9_1), "no icd9 dx", "icd9")吗?我很累,所以我可能错过了什么...... -
@PierreLafortune 对此感到抱歉——我只是举例说明我是如何创建第一个二进制变量
icd9_bin_1。创建这两个之后,我使用mutate和if_else为icd9_1或icd9_2创建二进制文件 -
试试
dat[c('icd9_bin_1', 'icd9_bin_2')] <- paste(c('yes', 'no')[is.na(dat[-1]) + 1L], rep(names(dat[-1]), each=nrow(dat)), sep='-') -
@Phil,是的,它有效(并且代码行数更少)。我想我希望有一个
dplyr解决方案让我在一个管道中创建所有三个变量?实际数据在多个变量中具有多达 50 个不同的icd9级别。
标签: r