我有一个相当大的分隔数据集,列出了与这些合成数据类似的行中的个体特征:
id; ICD_Codes
1; F10.10; F11.21; F31.81
2; G89.29; M54.5; F31.4; F11.21; F17.200; F43.10; Z72.0
3; F14.10; F17.200; F31.81; F31.32; F10.21
(And是的,每行的“列”数各不相同)
我想从中提取一系列虚拟代码,每个ICD_Codes
值一个,并使用给定个体是否呈现该值来填充这些虚拟变量,即:
| 身份证| F10.10 | F10.21 | F11.21 | F14.10 | F17.200 | F31.32 |F31.4| F31.81 | F43.10 | G89.29 |M54.5|Z72.0|
| --------------|--------------|--------------|--------------|--------------|--------------|--------------|--------------|--------------|--------------|--------------|--------------|--------------|
| 1|1|0|1|0|0|0|0|1|0|0|0|0|
| 二|0|0|1|0|1|0|1|0|1|1|1|1|
| 三|0|1|0|1|1|1|0|1|0|0|0|0|
或者,作为R Dataframe :
df <- data.frame(id = c(1, 2, 3),
F10.10 = c(1, 0, 0),
F10.21 = c(0, 0, 1),
F11.21 = c(1, 1, 0),
F14.10 = c(0, 0, 1),
F17.200 = c(0, 1, 1),
F31.32 = c(0, 0, 1),
F31.4 = c(0, 1, 0),
F31.81 = c(1, 0, 1),
F43.10 = c(0, 1, 0),
G89.29 = c(0, 1, 0),
M54.5 = c(0, 1, 0),
Z72.0 = c(0, 1, 0)
)
我想不出简单的方法来做到这一点(任何地方,包括在R中),但肯定有办法!
我将感激任何帮助这样做。
3条答案
按热度按时间piwo6bdm1#
假设您没有将数据导入R中,我们可以使用
read.table
将数据作为单列读取(选择一个随机的sep
符号,您确定不会出现在数据中)。然后将
id
和ICD_Codes
分成两列,并使用fastDummies::dummy_cols()
创建虚拟变量。最后rename
删除列前缀以适合您想要的输出。kt06eoxx2#
不使用额外的包,您可以使用
readLines
和strsplit
。然后使用outer
进行交叉grepl
。readLines(<path>)
。有证据表明它比tidyverse解决方案快得多:
hrysbysz3#
使用
mtabulate
即可