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)
归档时间: |
|
查看次数: |
586 次 |
最近记录: |