R 如何根据特定条件对一列进行聚合来重塑数据集?
我的数据集基于疾病计数。许多变量都是分类变量,例如周序列、月序列和年序列。这些标签表示疾病计数在我的时间序列数据中所属的周、月和年 我面临的问题是构建另一个数据表,该表将根据周序列、月序列和年序列对计数进行求和。我需要我的方法来决定是否将WeekSeries 1编码为R 如何根据特定条件对一列进行聚合来重塑数据集?,r,merge,dataframe,data.table,R,Merge,Dataframe,Data.table,我的数据集基于疾病计数。许多变量都是分类变量,例如周序列、月序列和年序列。这些标签表示疾病计数在我的时间序列数据中所属的周、月和年 我面临的问题是构建另一个数据表,该表将根据周序列、月序列和年序列对计数进行求和。我需要我的方法来决定是否将WeekSeries 1编码为TS1=1或TS2=1。例如,在原始数据中,您可以看到第三个观察值不在TS1中,而是在TS2中,因为它在TS2中,所以它也有HolidaysPerSeason=10 我希望该方法能够确定,如果周系列1中的大多数观察结果属于TS1=1
TS1=1
或TS2=1
。例如,在原始数据中,您可以看到第三个观察值不在TS1
中,而是在TS2
中,因为它在TS2
中,所以它也有HolidaysPerSeason=10
我希望该方法能够确定,如果周系列1中的大多数观察结果属于TS1=1
和HolidaysPerSeason=11
,那么这将是WeekSeries=1
的最终类别
原始数据
理想格式
这种格式对于建立回归模型和其他分析是必要的
这是与我的真实数据相似的假数据:
# 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
我能做些什么来重新获得其他分类变量?您要找的是分组?比如,像这样的事情? 您应该安装了
dplyr
和data.table
mydata\u new%group\u by(WeekSeries,TS1,HolidaySperseson)%%>%summary(count=n())
您要找的是哪个组?比如,像这样的事情?
您应该安装了dplyr
和data.table
mydata\u new%group\u by(WeekSeries,TS1,HolidaysPerSeason)%%>%summary(count=n())
这可以在几个地方进行优化,但应该给你一个基本的想法:
# 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
这可以在几个地方进行优化,但应能让您了解以下基本概念:
# 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。你能给你的代码添加注释,这样我就可以试着找出要调整的地方了吗?@eddie调整这个部分`by=c(tail(names(DT),-2))]`从-4到-2有效,但我不知道为什么。如果你能解释或指出你在哪里找到了解决方案,那就太好了!谢谢。你的解决方案确实有效。我不确定N是什么。有一个小时,我以为这是那一周的总计数。@Meli第一个“by”选择您感兴趣检查相同行的列(因此调整以满足您的需要是有意义的),并且
.N
计算这些列的每个分组的行数。计数列的名称(自动)是“N”。那么.SD呢?你能把你的解释解释得更清楚些吗?它是如何工作的整个[]
[]
[]
,里面有不同的东西可以满足我的需求?非常感谢您的光临!您的答案适用于我的测试数据集,但当我将其转换为更大的数据集时,我会丢失TS1和TS2。你能给你的代码添加注释,这样我就可以试着找出要调整的地方了吗?@eddie调整这个部分`by=c(tail(names(DT),-2))]`从-4到-2有效,但我不知道为什么。如果你能解释或指出你在哪里找到了解决方案,那就太好了!谢谢。你的解决方案确实有效。我不确定N是什么。有一个小时,我以为这是那一周的总计数。@Meli第一个“by”选择您感兴趣检查相同行的列(因此调整以满足您的需要是有意义的),并且.N
计算这些列的每个分组的行数。计数列的名称(自动)是“N”。那么.SD呢?你能把你的解释解释得更清楚些吗?它是如何工作的整个[]
[]
[]
,里面有不同的东西可以满足我的需求?非常感谢您的光临!当我将您的解决方案应用于更大的数据集时,它创建了额外的观察值。应该有583个观测值,但您的解决方案和eddi都创建了5000多个观测值。当我将您的解决方案应用到更大的数据集时,它创建了额外的观测值。应该有583个观察结果,但您的解决方案和eddi都创建了5000多个观察结果。
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
# 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