将第N行的NAs插入到data.frames列表中,从列表中插入N行。

问题描述 投票:0回答:1

经过无数个小时,我发现自己无法解决以下问题。

我有一个数据框列表。我想在每个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)}
}
r
1个回答
2
投票

你可以添加一个 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
© www.soinside.com 2019 - 2024. All rights reserved.