【问题标题】:Data frame "expand" procedure in R?R中的数据框“扩展”过程?
【发布时间】:2012-01-31 16:51:44
【问题描述】:

这不是一个真正的统计问题,而是执行实际统计分析之前的数据准备问题。我有一个由稀疏数据组成的数据框。我想逐组“扩展”这些数据以包括缺失值的零。

这是数据示例(ab 是定义组的两个因素,t 是稀疏时间戳,x 是值):

test <- data.frame(
    a=c(1,1,1,1,1,1,1,1,1,1,1),
    b=c(1,1,1,1,1,2,2,2,2,2,2),
    t=c(0,2,3,4,7,3,4,6,7,8,9),
    x=c(1,2,1,2,2,1,1,2,1,1,3))

假设我想扩展 t=0t=9 之间的值,这是我希望的结果:

test.expanded <- data.frame(
    a=c(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1),
    b=c(1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2),
    t=c(0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9),
    x=c(1,0,2,1,2,0,0,2,0,0,0,0,0,1,1,0,2,1,1,3))

已为t 的所有缺失值插入零。这使它更易于使用。

我有一个快速而肮脏的实现,它对数据框进行排序并循环遍历它的每一行,一次添加缺失的行。但我对解决方案并不完全满意。有没有更好的方法?

对于熟悉 SAS 的人来说,它类似于proc expand

谢谢!

【问题讨论】:

    标签: r time-series


    【解决方案1】:

    正如您在对另一个答案的评论中指出的那样,使用plyr 按组进行操作很容易,只需留下如何“填写”数据集。我的方法是使用merge

    library("plyr")
    
    test.expanded <- ddply(test, c("a","b"), function(DF) {
      DF <- merge(data.frame(t=0:9), DF[,c("t","x")], all.x=TRUE)
      DF[is.na(DF$x),"x"] <- 0
      DF
    })
    

    mergeall.x=TRUE 将使缺失值NA,因此需要在函数的第二行将那些NAs 替换为0。

    【讨论】:

      【解决方案2】:

      这很复杂,但工作正常:

      > test <- data.frame(
      +   a=c(1,1,1,1,1,1,1,1,1,1,1),
      +   b=c(1,1,1,1,1,2,2,2,2,2,2),
      +   t=c(0,2,3,4,7,3,4,6,7,8,9),
      +   x=c(1,2,1,2,2,1,1,2,1,1,3))
      > 
      > my.seq <- seq(0,9)
      > not.t <- !(my.seq %in% test$t)
      > test[nrow(test)+seq(length(my.seq[not.t])),"t"] <- my.seq[not.t]
      > test
          a  b t  x
      1   1  1 0  1
      2   1  1 2  2
      3   1  1 3  1
      4   1  1 4  2
      5   1  1 7  2
      6   1  2 3  1
      7   1  2 4  1
      8   1  2 6  2
      9   1  2 7  1
      10  1  2 8  1
      11  1  2 9  3
      12 NA NA 1 NA
      13 NA NA 5 NA
      

      不确定您是否希望它在之后按t 排序。如果是这样,很容易做到:

      https://stackoverflow.com/a/6871968/636656

      【讨论】:

      • 嗯。我看到您也想按其他变量对其进行分组。很容易扩展这种方法,但我会等着看其他人是否提出了肯定存在的命令来一步完成;-)
      • 是的,在这个例子中,输出数据框应该有 20 行,因为我有两组 (a=1,b=1) (a=1,b=2)。谢谢你的回答。
      • 哦,由于包plyr:ddply(test, c("a","b"), expand_function),结果分组并不是一个真正的问题,我可以定义expand_function按照你的提议。
      • plyr 再次证明很方便 :-)。 @BrianDiggs 的解决方案看起来不错。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-30
      • 1970-01-01
      • 2014-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多