首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何创造手段和s.d。带有data.table的列(基于多个条件)

如何创造手段和s.d。带有data.table的列(基于多个条件)
EN

Stack Overflow用户
提问于 2020-04-25 11:33:35
回答 2查看 176关注 0票数 3

我已经能够使用median meansd包创建一个基于几种条件的表。为此,我准备了数据。在我看来,它有点草率,而且我使用的是一个大数据集(>3gb),所以我已经使用了data.table

我想知道如何使用data.table 包更有效地创建类似的表,因此,如果能够做到这一点而不需要过多地准备数据的话。这将是伟大的,因为我需要这样做,在许多其他条件,以及。顺便说一句,我检查了this post,但它没有添加条件。

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

我需要mean of coniddate= 1年后的第一ii2 = A04A01

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

数据:

代码语言:javascript
复制
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 (= A01A04ii2中)和ds(自第一个A01A01 (在这里不正确)以来的天数)。

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

代码语言:javascript
复制
j.ds <- subset(DT, ds >= -365 & ds < 0)

而不是聚集到一个具有sum of con id的表中,如下所示:

代码语言:javascript
复制
j <- j.ds %>%
  group_by(id) %>% 
  summarise(con = sum(con))

在那里,我做了想要的桌子:

代码语言:javascript
复制
jP <- j %>%
  summarise(median = median(con), mean = mean(con), SD = sd(con))
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-04-25 12:27:36

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

代码语言:javascript
复制
DT[ds >= -365 & ds < 0, sum(con), by = "id"][, .(mean(V1), median(V1), sd(V1))]

第一个子集设置您的数据,然后每个id的和和,然后用第二个表达式取和的平均值等。

票数 2
EN

Stack Overflow用户

发布于 2020-04-25 11:43:01

因为我不能运行您的示例,所以我给您提供了一个未经测试的data.table转换您的dplyr代码。

您可以在data.table中非常有效地执行您正在执行的操作。

代码语言:javascript
复制
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来控制使用的列。例如,在您的示例中,列是字符:要完成将它们转换为数字所需的和。例如,如果您对conPS列感兴趣,您应该这样做:

代码语言:javascript
复制
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)))遵循相同的逻辑

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61424979

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档