0

我有一个如下所示的 data.frame:

   Element1     Element2        Value           Index   
         a         cf            0.14             1           
         a         ng            0.25             1           
         a         ck            0.12             1         
         a         rt            0.59             1      
         a         pl            0.05             1          
         b         gh            0.02             2          
         b         er            0.91             2
         b         jk            0.87             2
         c         qw            0.23             3
         c         po            0.15             3

我想要以下输出:

   Element_a1     Element_a2    Value_a       Element_b1   Element_b2  Value_b
         a         cf            0.14             b            gh       0.02      
         a         ng            0.25             b            er       0.91   
         a         ck            0.12             b            jk       0.87
         a         rt            0.59             NA           NA       NA
         a         pl            0.05             NA           NA       NA

等等...

我应用“split”函数根据“Index”列拆分初始data.frame,但data.frame由于单个数据的长度,我无法根据需要将拆分后的data.frame(即data.frames列表)转换为单个数据.frames 不相等。我试图申请(来自 ply 包)

x = do.call(rbind.fill, spl)

与另一篇文章一样,但会返回一个像最初的那样的 data.frame 。

4

2 回答 2

2

这是一种方法:

nRow <-  max(table(dat$Element1))          # maximum number of rows in a group
spl2 <- by(dat, dat$Element1, FUN = function(x) {           
  if (nRow > nrow(x)) {                    # insufficient number of rows?
    subdat <- dat[seq_len(nRow - nrow(x)), ]  # create a data frame
    subdat[ , ] <- NA                      # fill it with NAs
    return(rbind(x, subdat))}       # bind it to the subset and return the result
  return(x)                                # return the subset as it is
})
result <- do.call(cbind, spl2)             # bind all subsets together
于 2013-02-15T17:18:08.803 回答
1

我会使用它们,split然后将cbind它们放在一起,后填充。我借用了组合两个不同长度的数据帧的cbindPad功能:

cbindPad <- function(...){
  args <- list(...)
  n <- sapply(args,nrow)
  mx <- max(n)
  pad <- function(x, mx){
    if (nrow(x) < mx){
      nms <- colnames(x)
      padTemp <- matrix(NA,mx - nrow(x), ncol(x))
      colnames(padTemp) <- nms
      return(rbind(x,padTemp))
    }
    else{
      return(x)
    }
  }
  rs <- lapply(args,pad,mx)
  return(do.call(cbind,rs))
}

## assume your data is in a data.frame called dat
dat_split <- split(dat, dat$Element1)
out <- do.call( cbindPad, dat_split )
于 2013-02-15T16:59:29.017 回答