Вставить строку / строки NA в N-й строке в список data.frames с N из списка - PullRequest
3 голосов
/ 16 июня 2020

По прошествии нескольких часов я обнаружил, что не могу решить следующую проблему:

У меня есть список фреймов данных. Я хочу вставить (не заменить) одну или несколько строк NA (всегда как минимум одну строку) в каждый DF соответственно. Номера 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

From Добавить новую строку к кадру данных с указанием c индекс строки, не добавлен? , ответ 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 может мне помочь. Следующее работает, если к каждому df добавляется только одна строка. Например, это отлично работает:

#Example with insert of single row in both dataframes
Map(function(x,y){insertRow(x,y)},x=listDF,y=list(1,5))

Это вставляет одну строку NA в первую строку первого df и строку NA в пятую строку второго df. Однако, если я использую:

 #Example with insert of single row in both dataframes
    Map(function(x,y){insertRow(x,y)},x=listDF,y=listRI)

, функция не работает (поскольку второй список listRI имеет длину> 1. Что мне не хватает, если я правильно это понял, это aa for-l oop, который обновляет эти списки / dfs из listDF, где я хочу вставить несколько строк NA. Могу ли я получить какие-то сведения о том, как решить мою проблему?

Как всегда, сообщите мне, если я нужно быть более ясным. Best / John

Edit: я отредактировал пример кода, чтобы не только включать первые числа / номера индексов строк.

Edit (снова): на случай, если кто-то столкнется с этим код и собираюсь использовать, я обнаружил проблему с функцией 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)}
}

1 Ответ

3 голосов
/ 16 июня 2020

Вы можете добавить for l oop к go поверх listRI .

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...