Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何根据特定条件对一列进行聚合来重塑数据集?_R_Merge_Dataframe_Data.table - Fatal编程技术网

R 如何根据特定条件对一列进行聚合来重塑数据集?

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

我的数据集基于疾病计数。许多变量都是分类变量,例如周序列、月序列和年序列。这些标签表示疾病计数在我的时间序列数据中所属的周、月和年

我面临的问题是构建另一个数据表,该表将根据周序列、月序列和年序列对计数进行求和。我需要我的方法来决定是否将WeekSeries 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