По прошествии нескольких часов я обнаружил, что не могу решить следующую проблему:
У меня есть список фреймов данных. Я хочу вставить (не заменить) одну или несколько строк 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)}
}