展开data.frame并在另一列中插入平均值

时间:2014-10-06 07:55:15

标签: r set

如果数据集是

date        CPI  
2000/ 1     1.2 
2000/ 2     3.2
2000/ 3     1.6  

然后我想获得每周一次的cpi

所以这是我的预期结果。

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程序中执行此操作?

请帮帮我。我每月的Cpi差不多是200。

2 个答案:

答案 0 :(得分:3)

可能有帮助:

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

或使用data.table 这里的想法类似于上面的想法。首先使用data.framedata.table转换为setDT。创建一个新列Average:=CPI/n。然后使用rep复制n数据集的rownumbers,并使用该数字索引展开mydf的行

library(data.table)
setDT(mydf)[mydf[, Average:=CPI/n][,rep(seq_len(.N), each=n)]]
#      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

如果您需要将date分为yearquarter,如@ KFB的帖子所示,您可以使用cSplitdata.table。在下面的代码中,setnames用于在split之后重命名列。其余程序与上述相同。

cSplit的链接是https://gist.github.com/mrdwab/11380733

 library(devtools)
 source_gist(11380733)
 DT1 <- setnames(cSplit(mydf, "date", '[/]', fixed=FALSE,direction='wide'), 
                           c("CPI", "year", "Quarter"))
  DT1[DT1[, Average:= CPI/n][,rep(seq_len(.N), each=n)]]
  #   CPI year Quarter Average
  #1: 1.2 2000       1     0.3
  #2: 1.2 2000       1     0.3
  #3: 1.2 2000       1     0.3
  #4: 1.2 2000       1     0.3
  #5: 3.2 2000       2     0.8
  #6: 3.2 2000       2     0.8
  #7: 3.2 2000       2     0.8
  #8: 3.2 2000       2     0.8
  #9: 1.6 2000       3     0.4
 #10: 1.6 2000       3     0.4
 #11: 1.6 2000       3     0.4
 #12: 1.6 2000       3     0.4

数据

mydf <- structure(list(date = c("2000/ 1", "2000/ 2", "2000/ 3"), CPI = c(1.2, 
3.2, 1.6)), .Names = c("date", "CPI"), class = "data.frame", row.names = c("1", 
"2", "3"))

答案 1 :(得分:1)

使用@ akrun的另一个data.table解决方案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