展开data.frame并在另一列中插入average

展开data.frame并在另一列中插入average,r,set,R,Set,如果数据集是 date CPI 2000/ 1 1.2 2000/ 2 3.2 2000/ 3 1.6 然后我想得到一个每周的消费物价指数 所以这是我预期的结果 date CPI Average 2000/ 1 1.2 0.3 2000/ 1 1.2 0.3 2000/ 1 1.2 0.3 2000/ 1 1.2 0.3 2000/ 2 3.2 0.8 200

如果数据集是

date        CPI  
2000/ 1     1.2 
2000/ 2     3.2
2000/ 3     1.6  
然后我想得到一个每周的消费物价指数

所以这是我预期的结果

date        CPI   Average
2000/ 1     1.2    0.3
2000/ 1     1.2    0.3
2000/ 1     1.2    0.3
2000/ 1     1.2    0.3
2000/ 2     3.2    0.8
2000/ 2     3.2    0.8
2000/ 2     3.2    0.8
2000/ 2     3.2    0.8
2000/ 3     1.6    0.4
2000/ 3     1.6    0.4
2000/ 3     1.6    0.4
2000/ 3     1.6    0.4
在R程序中如何执行此操作

请帮帮我。我的每月消费物价指数接近200。

这可能有帮助:

n <- 4
mydf1 <- transform(mydf, Average=CPI/n)       #created a new column `Average` by dividing CPI by n
mydf2 <-mydf1[rep(1:nrow(mydf1),each=n),]     #replicate the row numbers of the dataset `mydf1` by `n` and used the numeric index to expand the rows of `mydf1`
row.names(mydf2) <- 1:nrow(mydf2)             #change the rownames  
mydf2
#     date CPI Average
#1  2000/ 1 1.2     0.3
#2  2000/ 1 1.2     0.3
#3  2000/ 1 1.2     0.3
#4  2000/ 1 1.2     0.3
#5  2000/ 2 3.2     0.8
#6  2000/ 2 3.2     0.8
#7  2000/ 2 3.2     0.8
#8  2000/ 2 3.2     0.8
#9  2000/ 3 1.6     0.4
#10 2000/ 3 1.6     0.4
#11 2000/ 3 1.6     0.4
#12 2000/ 3 1.6     0.4
如果您需要按照@KFB的帖子所示将日期分为年和季度,您可以使用cSplit和data.table。在下面的代码中,setnames用于在拆分后重命名列。其余步骤同上

指向cSplit的链接是

数据 这可能有帮助:

n <- 4
mydf1 <- transform(mydf, Average=CPI/n)       #created a new column `Average` by dividing CPI by n
mydf2 <-mydf1[rep(1:nrow(mydf1),each=n),]     #replicate the row numbers of the dataset `mydf1` by `n` and used the numeric index to expand the rows of `mydf1`
row.names(mydf2) <- 1:nrow(mydf2)             #change the rownames  
mydf2
#     date CPI Average
#1  2000/ 1 1.2     0.3
#2  2000/ 1 1.2     0.3
#3  2000/ 1 1.2     0.3
#4  2000/ 1 1.2     0.3
#5  2000/ 2 3.2     0.8
#6  2000/ 2 3.2     0.8
#7  2000/ 2 3.2     0.8
#8  2000/ 2 3.2     0.8
#9  2000/ 3 1.6     0.4
#10 2000/ 3 1.6     0.4
#11 2000/ 3 1.6     0.4
#12 2000/ 3 1.6     0.4
如果您需要按照@KFB的帖子所示将日期分为年和季度,您可以使用cSplit和data.table。在下面的代码中,setnames用于在拆分后重命名列。其余步骤同上

指向cSplit的链接是

数据
另一个data.table解决方案使用@akrun的mydf:

mydt = data.table(mydf)
mydt2 = mydt[,data.table(apply(.SD,2,function(x) rep(x,4))),]
mydt2$CPI = as.numeric(mydt2$CPI)
mydt2[,Average:=CPI/4,]
mydt2
       date CPI Average
 1: 2000/ 1 1.2     0.3
 2: 2000/ 2 3.2     0.8
 3: 2000/ 3 1.6     0.4
 4: 2000/ 1 1.2     0.3
 5: 2000/ 2 3.2     0.8
 6: 2000/ 3 1.6     0.4
 7: 2000/ 1 1.2     0.3
 8: 2000/ 2 3.2     0.8
 9: 2000/ 3 1.6     0.4
10: 2000/ 1 1.2     0.3
11: 2000/ 2 3.2     0.8
12: 2000/ 3 1.6     0.4

另一个data.table解决方案使用@akrun的mydf:

mydt = data.table(mydf)
mydt2 = mydt[,data.table(apply(.SD,2,function(x) rep(x,4))),]
mydt2$CPI = as.numeric(mydt2$CPI)
mydt2[,Average:=CPI/4,]
mydt2
       date CPI Average
 1: 2000/ 1 1.2     0.3
 2: 2000/ 2 3.2     0.8
 3: 2000/ 3 1.6     0.4
 4: 2000/ 1 1.2     0.3
 5: 2000/ 2 3.2     0.8
 6: 2000/ 3 1.6     0.4
 7: 2000/ 1 1.2     0.3
 8: 2000/ 2 3.2     0.8
 9: 2000/ 3 1.6     0.4
10: 2000/ 1 1.2     0.3
11: 2000/ 2 3.2     0.8
12: 2000/ 3 1.6     0.4

只是一张小纸条。尽量避免使用apply会很好,因为它会将data.table强制转换为矩阵。@Arun:谢谢你的提示,并祝data.table软件包一切顺利。只需要一个小提示。尽可能避免应用会很好,因为它会将data.table强制应用到矩阵。@Arun:感谢您的提示,并祝data.table软件包一切顺利。
mydt = data.table(mydf)
mydt2 = mydt[,data.table(apply(.SD,2,function(x) rep(x,4))),]
mydt2$CPI = as.numeric(mydt2$CPI)
mydt2[,Average:=CPI/4,]
mydt2
       date CPI Average
 1: 2000/ 1 1.2     0.3
 2: 2000/ 2 3.2     0.8
 3: 2000/ 3 1.6     0.4
 4: 2000/ 1 1.2     0.3
 5: 2000/ 2 3.2     0.8
 6: 2000/ 3 1.6     0.4
 7: 2000/ 1 1.2     0.3
 8: 2000/ 2 3.2     0.8
 9: 2000/ 3 1.6     0.4
10: 2000/ 1 1.2     0.3
11: 2000/ 2 3.2     0.8
12: 2000/ 3 1.6     0.4