【问题标题】:How to reshape a data set based on aggregating on one column with specific conditions?如何根据在具有特定条件的一列上聚合来重塑数据集?
【发布时间】:2016-07-04 02:00:57
【问题描述】:

我的数据集基于疾病计数。许多变量是分类变量,例如 WeekSeries、MonthSeries 和 YearSeries。这些标签指的是疾病计数在我的时间序列数据中属于哪个周、月和年。

我面临的问题是构建另一个数据表,该表将根据 WeekSeries、MonthSeries 和 YearSeries 对计数进行求和。我需要我的方法来决定 WeekSeries 1 是编码为 TS1 =1 还是 TS2=1。例如,在原始数据中,您可以看到第三个观察值不属于TS1,而是属于TS2,因为它属于TS2,所以它也有HolidaysPerSeason=10

我希望该方法决定如果 WeekSeries 1 中的大部分观察属于 TS1=1HolidaysPerSeason =11,那么这将是 WeekSeries=1 的最终类别。

原始数据

 WeekSeries  Counts  TS1  TS2  TS3  TS4  TS5  TS6  HolidaysPerSeason
     1         0      1    0    0    0    0    0          11
     1         1      1    0    0    0    0    0          11
     1         1      0    1    0    0    0    0          10

理想格式

WeekSeries  Counts  TS1  TS2  TS3  TS4  TS5  TS6  HolidaysPerSeason
     1        2      1    0    0    0    0    0          11
     

这种格式是构建回归模型和其他分析所必需的。

这是与我的真实数据相似的假数据:

    # a couple of the variables within my data
    JulianDate<-c(10985, 10986,10987)
    DateRcd<-c(NA,NA,"2000-01-31")
    Counts<-c(0,1,1)
    Day<-c("Sat","Sun","Mon")
    Weekend<-c(1,1,0)
    Season<-c(1,1,2)
    HolidaysPerSeason<-c(11,11,10)
    TS1<-c(1,1,0)
    TS2<-c(0,0,1)
    TS3<-c(0,0,0)
    TS4<-c(0,0,0)
    TS5<-c(0,0,0)
    TS6<-c(0,0,0)
    WeekSeries<-c(1,1,1)
    YearSeries<-c(1,1,1)
    MonthSeries<-c(1,1,1)
    mydata<-data.table(JulianDate,DateRcd,Counts,Day,Weekend,Season,HolidaysPerSeason, TS1,TS2,TS3,TS4,TS5,TS6,YearSeries,MonthSeries,WeekSeries) #data simulation

我尝试使用 data.table() 函数根据 WeekSeries 进行聚合,然后将其与原始数据合并以构建我理想的分析格式。

我最接近成功的尝试

install.packages("data.table")
library(data.table)

DT <- data.table(mydata)
mydata1<-DT[, by = list(WeekSeries)] #doesn't work
mydata2<-DT[,sum(CountsofCholera), by=WeekSeries] #loses all the other variables
idealdata<-merge(mydata2,mydata,by.x=mydata2$WeekSeries) #attempts to regain  the lost variable, this doesn't work because the datasets are not the same length

我可以做些什么来重新获得其他分类变量?

【问题讨论】:

    标签: r merge dataframe data.table


    【解决方案1】:

    group_by 是您要查找的内容吗?例如,像这样的东西? 你应该安装了dplyrdata.table

    mydata_new &lt;- mydata %&gt;% group_by(WeekSeries, TS1, HolidaysPerSeason) %&gt;% summarise(count = n())

    【讨论】:

    • 当我将您的解决方案应用于我的更大数据集时,它产生了额外的观察结果。应该有 583 个观察值,但您的解决方案和 eddi 都创建了超过 5000 个观察值。
    【解决方案2】:

    这可以在几个地方进行优化,但应该给你基本的想法:

    # sum up counts and count number of rows with identical values for the last several columns
    DT[, .(Count = sum(Counts), .N), by = c(tail(names(DT), -4))][
       # assign same count number = total count to each row within same WeekSeries
       , Count := sum(Count), by = WeekSeries][
       # extract most frequent row (i.e. one with largest N, computed in line 1)
       , .SD[which.max(N)], by = WeekSeries]
    #   WeekSeries Weekend Season HolidaysPerSeason TS1 TS2 TS3 TS4 TS5 TS6 YearSeries MonthSeries Count N
    #1:          1       1      1                11   1   0   0   0   0   0          1           1     2 2
    

    【讨论】:

    • 您的答案适用于我的测试数据集,但是当我将其转换为更大的数据集时,我会丢失 TS1 和 TS2。您能否将 cmets 添加到您的代码中,以便我可以尝试找出要调整的内容?
    • @eddie 用 = c(tail(names(DT), -2))]` 从 -4 到 -2 调整这部分是有效的,但我不知道为什么。如果你能解释或指出你在哪里找到了很棒的解决方案!谢谢。
    • 您的解决方案确实有效。我不确定N是什么。有一个小时,我以为这是那一周的计数总数。
    • @Meli 第一个“by”选择您有兴趣检查相同行的列(因此根据您的需要调整它是有意义的),.N 计算行数这些列的每个这样的分组。该计数列的名称(自动)是“N”。
    • .SD 怎么样?你能把你的解释更明确一点吗?它是如何工作的整个[ ][ ][ ] 里面有不同的东西让我得到我想要的?非常感谢故障!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-01
    相关资源
    最近更新 更多