编写一个函数来向数据框添加行

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

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

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

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

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

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

这将返回相同的数据框,并附加一行NAs:

> 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)

显然我错过了一些东西,但我不确定它是什么。任何帮助是极大的赞赏!

r
2个回答
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. Pass name and environment

你可以在函数中覆盖它,但它不是通常与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. Pass formula

或使用公式指定名称:

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

add_row_fo(~ data)

3. Non-standard evaluation

另一种可能性是使用非标准评估:

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)

如果您将其分配回data或新名称,那么添加NA行就足够了,所以也许您首先不需要add_row

更新

固定。添加了其他选择。


2
投票

您需要稍微修改您的代码,如下所示:

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

data <- add_row(data)
© www.soinside.com 2019 - 2024. All rights reserved.