基于多个列中的多个条件创建新列

维莱克

更新以在新变量中包含多个选项:

我正在处理一个混乱的大数据患者文件(> 4000万行)。每个患者(id)有几行。每行(大致)代表一个症状/疾病代码(icpc)的咨询。我添加了一个新列,其中包含针对特定疾病患者的类别(基于icpcicpc2)。

我的原始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和/或是的患者进行分类以下作品:A01icpcicpc2

cond1 <- c("D95", "A01")
setDT(df)[, condit := ifelse(any(icpc %in% cond1 | icpc2 %in% cond1), "yes","no"), by=id]
df

但是现在我想对新列中的代码icpcicpc2新列进行分类condit因此,举例来说,D95和/或A01的icpcicpc2作为AA04和/或T08作为BB10Ccondit注意: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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何基于R中的多个条件创建新列?

基于R中的多个条件语句创建新列

如何基于多个条件语句创建多个新列?

基于r中的多个条件创建列

基于多个条件的新列

如何通过多个列组,创建一个基于Python中条件的新列?

通过基于多个条件求和特定列以在R中创建新列

Python:基于多个条件从行创建新列

基于多个条件语句熊猫数据框创建新列

如何基于多个列的条件在Pandas中创建列总和?

使用基于多个百分位条件的数据在熊猫中创建新列

基于同一数据框中的多个条件创建新列

基于多个条件添加新列

如何在r中基于多个条件创建列?

Python:基于模式创建多个新列

根据 r 中的多个条件创建新列

Pyspark基于具有列表或集合的多个条件的其他列创建新列

如何基于现有列熊猫的多个条件创建新列

如何基于R数据框中的多个列条件创建基于排名的列

如何基于多个列上多个条件的组合为数据框中的新列分配值

如何根据R中其他列的多个条件创建多个新列?

基于多个列条件创建其他列

如何在pyspark的窗口上基于多个条件创建新列?

如何基于R中的多个条件创建新的数据集?

使用多个条件的df中的新列

根据多个列上的多个特定条件在熊猫中创建新列-Pandas

基于多个条件的新列,忽略缺失值

如何基于多个先前值的熊猫条件计算新列

Pandas DataFrame基于多个条件的分组添加新的列值