汇总R中动态平均值的季度数据集?

时间:2016-03-24 19:48:06

标签: r dplyr

我有季度支出数据,如下所示:

Q1:

ID  TRANS
1   454
2   370
3   40
4   0

Q2:

ID  TRANS
1   100
2   400
3   303
4   43
5   0
6   100

Q3:

ID  TRANS
3   20
6   300
7   400
8   300
9   100

Q4:

ID  TRANS
3   231
7   100
8   240
9   100
10  102

最后,我想最终得到一个数据集,每个季度都包含TRANS列,然后根据代码中非零输入的数量对它们进行平均。

因此,例如,最终数据集看起来像这样:

ID  T1  T2  T3  T4  TOT AVG
1   454 100 0   0   554 554/2
2   370 400 0   0   770 770/2
3   40  303 20  231 594 594/4
4   0   43  0   0   43  43/1
5   0   0   0   0   0   0
6   0   100 300 0   400 400/2
7   0   0   400 100 500 500/2
8   0   0   300 240 540 540/2
9   0   0   100 100 200 200/2
10  0   0   0   102 102 102/1

T1-T4是季度值(如果写入0,则为0,或者如果没有记录值),并且AVG是这些值的平均值,取决于T1-T4中的条目数。

因此,如果ID#7有2个值,那么总数将被除以2.(我以分红/除数格式离开了AVG类别,因此您可以在那里看到逻辑)。

这对于基本的merge()函数来说似乎有点复杂,特别是最后的计数和动态平均。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

这个框架工作应该让你开始,取决于你有多少行/列,它的一部分可以自动化。它从合并开始,然后使用rowMeans来平均你的平均值。它只是一个框架,绝对可以优化。

#dummy data frames

ID <- c(1,2,3,4)
TRANS <- c(0,370,0,0)

T1 <-data.frame(ID,TRANS)

ID <- c(1,9,5,6,7)
TRANS <- c(123,456,40,789,987)

T2 <-data.frame(ID,TRANS)


#renaming "TRANS" to a "T*"
colnames(T1)<-c("ID","T1")
colnames(T2)<-c("ID","T2")


#Merging the frames, setting the row name to the ID make it easier to average rows.
Merged_fr <- transform(merge(x =T1, y =T2,all = TRUE, by = "ID"),row.names= ID, ID = NULL)

# set 0's to NA
Merged_fr[Merged_fr == 0] <- NA

#average rows

Merged_fr$AVG = rowMeans(Merged_fr, na.rm = TRUE)

#Set NA's to 0

Merged_fr[is.na(Merged_fr)] <- 0