编写函数以将行添加到数据框

时间:2018-09-10 19:10:58

标签: r

我正在尝试编写一个函数,该函数将自动在数据帧的末尾添加一个空行,并将结果数据帧分配给原始名称。

作为示例,我使用以下方法创建了空数据框data

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

我可以使用单括号子集向data添加一行,以将NA分配给新行的所有变量:

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 :(得分:3)

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

更新

已修复。添加了其他选择。

答案 1 :(得分:2)

您需要对代码进行如下修改:

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

data <- add_row(data)