将第N行的NAs插入到data.frames列表中,从列表中插入N行。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将第N行的NAs插入到data.frames列表中,从列表中插入N行。相关的知识,希望对你有一定的参考价值。
经过无数个小时,我发现自己无法解决以下问题。
我有一个数据框列表。我想在每个DF中分别插入(而不是替换)一行或多行NA(总是至少一行)。要插入的NA的数量被存储在一个单独的列表中。
为了说明这一点,我有以下两个列表。
#list of dataframes
listDF <- list(data.frame(1:10),data.frame(1:9))
#list of row-indexes
listRI<- list(1,c(3,5))
因此,我的任务是,将一行NA插入到第一个数据帧的第一行。listDF
和两行NA(第3行和第5行)到第二个数据帧上。listDF
来自 在数据框中添加新的行,在特定的行索引处,而不是追加?,答案156,我做了以下函数。
insertRow <- function(df, rowindex) {
df[seq(rowindex+1,nrow(df)+1),] <- df[seq(rowindex,nrow(df)),]
df[rowindex,] <- rep(NA,ncol(df))
df
}
在这之后,我不知道该如何继续。看了看SO和其他页面,我想Map-function也许能帮到我。下面只要是每一个df只增加一行就可以了。例如,这个函数就很好用。
#Example with insert of single row in both dataframes
Map(function(x,y){insertRow(x,y)},x=listDF,y=list(1,5))
在第一个数据集的第一行插入一行NA 在第二个数据集的第五行插入一行NA。但是如果我使用:
#Example with insert of single row in both dataframes
Map(function(x,y){insertRow(x,y)},x=listDF,y=listRI)
函数就不工作了(因为第二个列表中的 listRI
如果我的理解正确的话,我所错过的是一个for-loop,更新这些listsdfs的长度为1。listDF
其中我想插入几行NA。我可以得到一些意见,如何解决我的问题?
如果我需要说得更清楚,请告诉我。最好的约翰
编辑:我编辑了示例代码,不仅包括行索引的首数。
编辑(再次):为了防止有人碰到这段代码并打算使用,我发现了一个关于 insertRow
函数,如果打算在数据框中添加一条新行。我通过编辑函数解决了这个问题,具体如下。
insertRow <- function(df, rowindex) {
if(rowindex<=nrow(df)){df[seq(rowindex+1,nrow(df)+1),] <- df[seq(rowindex,nrow(df)),]
df[rowindex,] <- rep(NA,ncol(df))
return(df)}
if(rowindex>=nrow(df)+1){df[nrow(df)+1,]<-rep(NA,ncol(df))
return(df)}
}
你可以添加一个 for
循环往复 列表RI.
Map(function(x,y){for(i in y) {x <- insertRow(x, i)}; x},x=listDF,y=listRI)
#[[1]]
# X1.10
#1 NA
#2 1
#3 2
#4 3
#5 4
#6 5
#7 6
#8 7
#9 8
#10 9
#11 10
#
#[[2]]
# X1.9
#1 1
#2 2
#3 NA
#4 3
#5 NA
#6 4
#7 5
#8 6
#9 7
#10 8
#11 9
以上是关于将第N行的NAs插入到data.frames列表中,从列表中插入N行。的主要内容,如果未能解决你的问题,请参考以下文章