我正在尝试编写一个函数,该函数将自动在数据帧的末尾添加一个空行,并将结果数据帧分配给原始名称。
作为示例,我使用以下方法创建了空数据框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)
很明显我遗漏了一些东西,但是我不确定它可能是什么。任何帮助将不胜感激!
答案 0 :(得分:3)
返回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)
添加一个NA行就足够了,只要您将其分配回data
或一个新名称,这样一来您就不需要add_row
。
已修复。添加了其他选择。
答案 1 :(得分:2)
您需要对代码进行如下修改:
add_row <- function(df) {
df[nrow(df) + 1, 1:ncol(df)] <- NA
return(df)
}
data <- add_row(data)