Написание функции для добавления строк во фрейм данных - PullRequest
0 голосов
/ 10 сентября 2018

Я пытаюсь написать функцию, которая автоматически добавит пустую строку в конец фрейма данных и присвоит результирующий фрейм данных исходному имени.

В качестве примера я создалпустой фрейм данных data с использованием:

data <- data.frame(id = integer(0), name = character(0))

Я могу добавить строку к data, используя подстановку в одну скобку, чтобы назначить NA s всем переменным для новой строки:

data[nrow(data) + 1, 1:ncol(data)] <- NA

Возвращает тот же фрейм данных с дополнительной строкой NA s:

> data
  id name
1 NA <NA>   

Двойной запуск подтверждает, что код-фрагмент работает:

> data <- data.frame(id = integer(0), name = character(0))
> data[nrow(data) + 1, 1:ncol(data)] <- NA
> data[nrow(data) + 1, 1:ncol(data)] <- NA
> data
  id name
1 NA <NA>
2 NA <NA>

Проблема возникает, когда я пытаюсь обернуть этот код в функцию:

add_row <- function(df) {
df[nrow(df) + 1, 1:ncol(df)] <- NA
}

Вызов add_row() не возвращает ошибок, но не добавляет новую строку во фрейм данных:

> add_row(data)
> data
[1] id   name
<0 rows> (or 0-length row.names)

Я явно что-то упускаю, но я не уверен, что это может быть.Любая помощь с благодарностью!

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

Вам нужно немного изменить свой код следующим образом:

add_row <- function(df) {
  df[nrow(df) + 1, 1:ncol(df)] <- NA
  return(df)
}

data <- add_row(data)
0 голосов
/ 10 сентября 2018

A.Функциональный подход

Вернуть df и затем присвоить его новому фрейму данных или перезаписать существующий:

add_row <- function(df) {
  df[nrow(df) + 1, 1:ncol(df)] <- NA
  df
}

data <- add_row(data)
# or
data2 <- add_row(data)

B.На месте

1.Имя пароля и окружение

Вы можете перезаписать его изнутри функции, но это не тот функциональный стиль, который обычно используется с R, который подчеркивает обработку без побочных эффектов.

add_row_name <- function(df, envir = parent.frame()) {
  dfx <- envir[[df]]
  dfx[nrow(dfx) + 1, 1:ncol(dfx)] <- NA
  envir[[df]] <- dfx
  invisible(dfx)
}

add_row_name("data")

2.Передайте формулу

или укажите имя, используя формулу:

add_row_fo <- function(formula, envir = environment(formula)) {
    add_row_name(all.vars(formula), envir)
}

add_row_fo(~ data)

3.Нестандартная оценка

Другая возможность заключается в использовании нестандартной оценки:

add_row_ns <- function(df, envir = parent.frame()) {
  nm <- deparse(substitute(df))
  dfx <- envir[[nm]]
  dfx[nrow(dfx) + 1, 1:ncol(dfx)] <- NA
  envir[[nm]] <- dfx
  invisible(dfx)
}

add_row_ns(data)

C.rbind

Выше мы основали код на этом вопросе, но учтите, что

rbind(data, NA)

будет достаточно, чтобы добавить строку NA, если вы присвоите ее обратно data или новомуимя, поэтому, возможно, вам не нужно add_row во-первых.

Обновление

Исправлено.Добавлены дополнительные альтернативы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...