如何在data.frame中插入行?

时间:2017-04-11 11:50:53

标签: r dataframe insert

假设您有一个data.frame对象:

foo <- data.frame(ID=LETTERS[1:10], 
          blah=1:10, foo=1:10, 
          row.names=letters[1:10])

我希望在data.frame中的任意位置插入一行。也许作为第一行,也许是最后一行。然而,

  • 生成的data.frame的数据类型必须与原始数据框中的数据类型相同
  • 必须保留行名称

我尝试用rbind来做,最后编写了一个仍然无法正常工作的冗长函数。是不是有一种优雅的方式呢?

我在下面加入了我的功能,但我认为这不好。

df.insert <- function(df, i, row, rowname) {
  if(is.null(df)) return(df)
  if(!is.list(row)) stop("row must be a list")
  if(!all(names(rowname) %in% colnames(df)))
    stop("df.insert error: all names of rowname must be in colnames of df")

  rnames <- rownames(df)
  nr <- nrow(df)
  if(i > nr) i <- nr

  for(n in colnames(df))
    if(!n %in% names(row)) row[[n]] <- NA

  if(nr == 0)      {
    ret <- data.frame(row)
    rownames(ret) <- rowname
  } else if(i == 0) { 
    ret <- rbind(row, df, make.row.names=FALSE)
    rownames(ret) <- c(rowname, rnames)
  } else if(i == nr) {
    ret <- rbind(df, row, make.row.names=FALSE)
    rownames(ret) <- c(rnames, rowname)
  } else { 
    ret <- rbind(df[1:i,], row, df[(i+1):nr,], make.row.names=FALSE)
    rownames(ret) <- c(rnames[1:i], rowname, rnames[(i+1):nr])
  }
  return(ret)
}

编辑:this question的答案不处理两件事,即(i)在数据框的末尾追加行,以及(ii)处理行名。但是,它们提供了一个优雅的解决方案,我正在努力。

0 个答案:

没有答案