首页 > 解决方案 > 如何使用 data.table 创建 mean 和 sd 列(基于多个条件)

问题描述

我已经能够根据几个条件使用包创建一个带有median meanand的表。为此,我准备了数据。它对我来说看起来有点草率,我使用的是一个大数据集(>3gb),所以我已经在使用了。sddplrydata.table

我想知道如何使用data.tablepackage更有效地创建一个类似的表,所以,如果可以在不准备太多数据的情况下做到这一点。那太好了,因为我也需要在许多其他条件下这样做。顺便说一句,我查看了这篇文章,但它没有添加条件。

这就是我所拥有和需要的:

自第一次或=或以来mean,我需要conbyiddate= 1 年。ii2A04A01

编辑(因为它之前没有运行):

数据:

DT <- structure(list(id = c(123L, 123L, 332L, 332L, 332L, 100L, 100L, 113L, 113L, 113L, 113L, 551L, 551L), 
               i = c("D95", "F85", "A01", "A04", "K20", "B10", "A04", "T08", "P28", "D95", "A04", "B12", "D95"), 
               i2 = c("F15", "", "", "", "", "", "", "", "", "A01", "", "A01", ""), 
               date = c("2015-06-19", "2016-08-15", "2013-03-16", "2017-01-17", "2013-01-16", "2009-05-08", "2011-04-03", "2015-05-04",
                        "2011-04-04", "2017-08-04", "2011-05-24", "2013-11-04", "2013-05-04"), 
               con = c("1", "1", "1", "1", "1", "1", "1", "1", "1", "1",  "1", "1", "1"), 
               PS = c("0",  "0", "1", "0", "0", "0", "1", "0", "0", "0", "1", "1", "0")), 
          class = "data.frame", row.names = c(NA, -13L))

以下是我到目前为止所做的(并且有效):

我根据数据创建了列PS(= 具有orA01A04in )和(=从第一次开始的天数或(此处的天数不正确))。ii2dsA01A01

有了这个dplyr包,我首先做了一个data.table只有ds-365&0之间的行。

j.ds <- subset(DT, ds >= -365 & ds < 0)

比使用 per 聚合到一个表中sum,如下所示:conid

j <- j.ds %>%
  group_by(id) %>% 
  summarise(con = sum(con))

从那里我制作了所需的表格:

jP <- j %>%
  summarise(median = median(con), mean = mean(con), SD = sd(con))

标签: rdplyrdata.table

解决方案


据我所知,对于介于 -365 和 0 之间的数据,您需要conper的总和,然后是这些总和的平均值、中位数和标准差。这可以通过链接两个表达式来完成。idds

DT[ds >= -365 & ds < 0, sum(con), by = "id"][, .(mean(V1), median(V1), sd(V1))]

这首先对您的数据进行子集化,然后对conper求和id,然后用第二个表达式取总和的平均值等


推荐阅读