更新以在新变量中包含多个选项:
我正在处理一个混乱的大数据患者文件(> 4000万行)。每个患者(id
)有几行。每行(大致)代表一个症状/疾病代码(icpc
)的咨询。我添加了一个新列,其中包含针对特定疾病患者的类别(基于icpc
和icpc2
)。
我的原始data.frame(df
)看起来像这样(这是伪造的数据,id
在我的数据集中要长得多,并且我不希望删除不相关的列):
id icpc icpc2 reg.date
1: 123 D95 F15 19JUN2015
2: 123 F85 15AUG2016
3: 332 A01 16MAR2010
4: 332 A04 20JAN2018
5: 332 K20 20FEB2017
6: 100 B10 01JUN2017
7: 100 A04 11JAN2008
8: 113 T08 18MAR2018
9: 113 P28 19JAN2017
10: 113 D95 A01 16JAN2013
11: 113 A04 01MAY2009
12: 551 B12 A01 03APR2011
13: 551 D95 09MAY2015
假设我想在名为“ condit”的新列(基于和)中对具有D95
和/或是的患者进行分类。以下作品:A01
icpc
icpc2
cond1 <- c("D95", "A01")
setDT(df)[, condit := ifelse(any(icpc %in% cond1 | icpc2 %in% cond1), "yes","no"), by=id]
df
但是现在我想对新列中的代码icpc
和icpc2
新列进行分类condit
。因此,举例来说,D95和/或A01的icpc
或icpc2
作为A
,A04
和/或T08
作为B
,B10
如C
在condit
。注意:A
应覆盖B
(请参见第4、8和11行),B
应覆盖C
等(因为id可能属于多个类别)。
这是df
我想要的data.frame():
id icpc icpc2 reg.date condit
1: 123 D95 F15 19JUN2015 A
2: 123 F85 15AUG2016 A
3: 332 A01 16MAR2010 A
4: 332 A04 20JAN2018 A
5: 332 K20 20FEB2017 A
6: 100 B10 01JUN2017 C
7: 100 A04 11JAN2008 C
8: 113 T08 18MAR2018 A
9: 113 P28 19JAN2017 A
10: 113 D95 A01 16JAN2013 A
11: 113 A04 01MAY2009 A
12: 551 B12 A01 03APR2011 A
13: 551 D90 09MAY2015 A
任何帮助将不胜感激。谢谢!
对于大型(> 4000万行)数据集,data.table包可能是一个不错的选择:
library(data.table)
cond1 <- c("D95", "A01")
setDT(df)[, condit := ifelse(any(icpc %in% cond1 | icpc2 %in% cond1), "yes","no"), by=id]
df
id icpc icpc2 reg.date condit
1: 123 D95 F15 19JUN2015 yes
2: 123 F85 15AUG2016 yes
3: 332 A01 16MAR2010 yes
4: 332 A04 20JAN2018 yes
5: 332 K20 20FEB2017 yes
6: 100 B10 01JUN2017 no
7: 100 A04 11JAN2008 no
8: 113 T08 18MAR2018 yes
9: 113 P28 19JAN2017 yes
10: 113 D95 A01 16JAN2013 yes
11: 113 A04 01MAY2009 yes
12: 551 B12 A01 03APR2011 yes
13: 551 D95 09MAY2015 yes
资料:
df <- structure(list(id = c(123L, 123L, 332L, 332L, 332L, 100L, 100L,
113L, 113L, 113L, 113L, 551L, 551L), icpc = c("D95", "F85", "A01",
"A04", "K20", "B10", "A04", "T08", "P28", "D95", "A04", "B12",
"D95"), icpc2 = c("F15", "", "", "", "", "", "", "", "", "A01",
"", "A01", ""), reg.date = c("19JUN2015", "15AUG2016", "16MAR2010",
"20JAN2018", "20FEB2017", "01JUN2017", "11JAN2008", "18MAR2018",
"19JAN2017", "16JAN2013", "01MAY2009", "03APR2011", "09MAY2015"
)), class = "data.frame", row.names = c(NA, -13L))
编辑:对于多个条件:
cond1 <- c("D95", "A01") # A
cond2 <- c("A04", "T08") # B
cond3 <- "B10" # C
setDT(df)[, condit := if(any(icpc %in% cond1 | icpc2 %in% cond1)) "A" else
if(any(icpc %in% cond2 | icpc2 %in% cond2)) "B" else
if(any(icpc %in% cond3 | icpc2 %in% cond3)) "C" else "", by=id]
id icpc icpc2 reg.date condit
1: 123 D95 F15 19JUN2015 A
2: 123 F85 15AUG2016 A
3: 332 A01 16MAR2010 A
4: 332 A04 20JAN2018 A
5: 332 K20 20FEB2017 A
6: 100 B10 01JUN2017 B
7: 100 A04 11JAN2008 B
8: 113 T08 18MAR2018 A
9: 113 P28 19JAN2017 A
10: 113 D95 A01 16JAN2013 A
11: 113 A04 01MAY2009 A
12: 551 B12 B10 03APR2011 C
13: 551 D96 09MAY2015 C
数据:(由于未找到“ C”条件,因此与原始数据略有修改。
df <- structure(list(id = c(123L, 123L, 332L, 332L, 332L, 100L, 100L,
113L, 113L, 113L, 113L, 551L, 551L), icpc = c("D95", "F85", "A01",
"A04", "K20", "B10", "A04", "T08", "P28", "D95", "A04", "B12",
"D96"), icpc2 = c("F15", "", "", "", "", "", "", "", "", "A01",
"", "B10", ""), reg.date = c("19JUN2015", "15AUG2016", "16MAR2010",
"20JAN2018", "20FEB2017", "01JUN2017", "11JAN2008", "18MAR2018",
"19JAN2017", "16JAN2013", "01MAY2009", "03APR2011", "09MAY2015"
)), class = "data.frame", row.names = c(NA, -13L))
在具有40M行的数据帧上进行了测试:system.time(...)
# user system elapsed
# 111.11 1.17 111.97
使用dplyr:
# Error: cannot allocate vector of size 274.7 Mb
# Timing stopped at: 4.19 1.11 5.39
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句