我正在尝试编写一个函数,它会自动将空行添加到数据帧的末尾,并将结果数据帧分配给原始名称。
作为一个例子,我使用以下方法创建了空数据框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)
显然我错过了一些东西,但我不确定它是什么。任何帮助是极大的赞赏!
返回df
然后将其分配给新数据框或覆盖现有数据框:
add_row <- function(df) {
df[nrow(df) + 1, 1:ncol(df)] <- NA
df
}
data <- add_row(data)
# or
data2 <- add_row(data)
你可以在函数中覆盖它,但它不是通常与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")
或使用公式指定名称:
add_row_fo <- function(formula, envir = environment(formula)) {
add_row_name(all.vars(formula), envir)
}
add_row_fo(~ data)
另一种可能性是使用非标准评估:
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)
上面我们根据问题中的代码编写,但请注意
rbind(data, NA)
如果您将其分配回data
或新名称,那么添加NA行就足够了,所以也许您首先不需要add_row
。
固定。添加了其他选择。
您需要稍微修改您的代码,如下所示:
add_row <- function(df) {
df[nrow(df) + 1, 1:ncol(df)] <- NA
return(df)
}
data <- add_row(data)