将变量值重新整形为列的最快​​方法

Mat*_*att 11 performance r reshape

我有一个大约300万行的数据集和以下结构:

PatientID| Year | PrimaryConditionGroup
---------------------------------------
1        | Y1   | TRAUMA
1        | Y1   | PREGNANCY
2        | Y2   | SEIZURE
3        | Y1   | TRAUMA
Run Code Online (Sandbox Code Playgroud)

作为R的新手,我在找到将数据重塑为下面结构的正确方法时遇到了一些麻烦:

PatientID| Year | TRAUMA | PREGNANCY | SEIZURE
----------------------------------------------
1        | Y1   | 1      | 1         | 0
2        | Y2   | 0      | 0         | 1
3        | Y1   | 1      | 0         | 1
Run Code Online (Sandbox Code Playgroud)

我的问题是:创建data.frame的最快/最优雅的方法是什么,其中PrimaryConditionGroup的值成为列,按PatientID和Year(计算出现的次数)分组?

Jos*_*ien 12

可能有更简洁的方法可以做到这一点,但是对于纯粹的速度,很难打败data.table基于解决方案:

df <- read.table(text="PatientID Year  PrimaryConditionGroup
1         Y1    TRAUMA
1         Y1    PREGNANCY
2         Y2    SEIZURE
3         Y1    TRAUMA", header=T)

library(data.table)
dt <- data.table(df, key=c("PatientID", "Year"))

dt[ , list(TRAUMA =    sum(PrimaryConditionGroup=="TRAUMA"),
           PREGNANCY = sum(PrimaryConditionGroup=="PREGNANCY"),
           SEIZURE =   sum(PrimaryConditionGroup=="SEIZURE")),
   by = list(PatientID, Year)]

#      PatientID Year TRAUMA PREGNANCY SEIZURE
# [1,]         1   Y1      1         1       0
# [2,]         2   Y2      0         0       1
# [3,]         3   Y1      1         0       0
Run Code Online (Sandbox Code Playgroud)

编辑: aggregate()提供一个'基础R'解决方案,可能或可能不是更惯用.(唯一的复杂因素是聚合返回一个矩阵,而不是data.frame;下面的第二行修复了这个.)

out <- aggregate(PrimaryConditionGroup ~ PatientID + Year, data=df, FUN=table)
out <- cbind(out[1:2], data.frame(out[3][[1]]))
Run Code Online (Sandbox Code Playgroud)

第二次编辑最后,使用该reshape软件包的简洁解决方案可以让您到达同一个地方.

library(reshape)
mdf <- melt(df, id=c("PatientID", "Year"))
cast(PatientID + Year ~ value, data=j, fun.aggregate=length)
Run Code Online (Sandbox Code Playgroud)