我有季度支出数据,如下所示:
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()函数来说似乎有点复杂,特别是最后的计数和动态平均。有什么想法吗?
答案 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