gpt4 book ai didi

r - 将变量值 reshape 为列的最快​​方法

转载 作者:行者123 更新时间:2023-12-04 02:03:27 25 4
gpt4 key购买 nike

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

PatientID| Year | PrimaryConditionGroup
---------------------------------------
1 | Y1 | TRAUMA
1 | Y1 | PREGNANCY
2 | Y2 | SEIZURE
3 | Y1 | TRAUMA

作为 R 的新手,我很难找到将数据 reshape 为下面概述的结构的正确方法:
PatientID| Year | TRAUMA | PREGNANCY | SEIZURE
----------------------------------------------
1 | Y1 | 1 | 1 | 0
2 | Y2 | 0 | 0 | 1
3 | Y1 | 1 | 0 | 1

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

最佳答案

可能有更简洁的方法可以做到这一点,但就速度而言,很难击败 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

编辑: aggregate()提供了一个'base R'解决方案,它可能会也可能不会更惯用。 (唯一的复杂性是聚合返回一个矩阵,而不是一个 data.frame;下面的第二行解决了这个问题。)
out <- aggregate(PrimaryConditionGroup ~ PatientID + Year, data=df, FUN=table)
out <- cbind(out[1:2], data.frame(out[3][[1]]))

第二次编辑 最后,使用 reshape 的简洁解决方案包裹将您带到同一个地方。
library(reshape)
mdf <- melt(df, id=c("PatientID", "Year"))
cast(PatientID + Year ~ value, data=j, fun.aggregate=length)

关于r - 将变量值 reshape 为列的最快​​方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8142176/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com