我已经能够使用median mean和sd包创建一个基于几种条件的表。为此,我准备了数据。在我看来,它有点草率,而且我使用的是一个大数据集(>3gb),所以我已经使用了data.table。
我想知道如何使用data.table 包更有效地创建类似的表,因此,如果能够做到这一点而不需要过多地准备数据的话。这将是伟大的,因为我需要这样做,在许多其他条件,以及。顺便说一句,我检查了this post,但它没有添加条件。
,这是我所拥有和需要的:
我需要mean of con的id和date= 1年后的第一i或i2 = A04或A01。
编辑(因为它以前没有运行):
数据:
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 (= A01或A04在i或i2中)和ds(自第一个A01或A01 (在这里不正确)以来的天数)。
使用dplyr包,我首先做了一个data.table,其中只有在-365&0之间只有ds的行。
j.ds <- subset(DT, ds >= -365 & ds < 0)而不是聚集到一个具有sum of con id的表中,如下所示:
j <- j.ds %>%
group_by(id) %>%
summarise(con = sum(con))在那里,我做了想要的桌子:
jP <- j %>%
summarise(median = median(con), mean = mean(con), SD = sd(con))发布于 2020-04-25 12:27:36
据我所知,对于con在-365到0之间的数据,需要每个id的和,然后是这些和的平均值、中位数和标准差。这可以通过链接两个表达式来完成。
DT[ds >= -365 & ds < 0, sum(con), by = "id"][, .(mean(V1), median(V1), sd(V1))]第一个子集设置您的数据,然后每个id的和和,然后用第二个表达式取和的平均值等。
发布于 2020-04-25 11:43:01
因为我不能运行您的示例,所以我给您提供了一个未经测试的data.table转换您的dplyr代码。
您可以在data.table中非常有效地执行您正在执行的操作。
library(data.table)
setDT(jx)
j <- jx[ds >= -365 & ds < 0, lapply(.SD, sum), by = "id"]
jP <- j[, lapply(.SD, function(x) return(c(median(x), mean(x), sd(x)))]
jP[,'stat' := c("median","mean","sd")你最终得到了一个长格式的数据格式。
编辑
如果您有非数字列,则不能对它们进行求和.您可以使用.SD和.SDcols来控制使用的列。例如,在您的示例中,列是字符:要完成将它们转换为数字所需的和。例如,如果您对con和PS列感兴趣,您应该这样做:
cols <- c("con","PS")
j <- DT[,lapply(.SD, function(x) sum(as.numeric(x))), by = "id", .SDcols = cols]使用function(x) sum(as.numeric(x)),您可以创建一个匿名函数(相当于python中的lambda函数,它应用as.numeric并将subset of data (SD)中的所有元素相加)。
匿名函数return(c(median(x), mean(x), sd(x)))遵循相同的逻辑
https://stackoverflow.com/questions/61424979
复制相似问题