假设您有一个data.frame
对象:
foo <- data.frame(ID=LETTERS[1:10],
blah=1:10, foo=1:10,
row.names=letters[1:10])
我希望在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)处理行名。但是,它们提供了一个优雅的解决方案,我正在努力。