通过用户定义的函数向数据框添加列

时间:2017-09-19 15:39:22

标签: r dataframe user-defined-functions

我正在尝试将列添加到多个数据框中。我正在尝试创建一个将添加列的函数,然后我想在对象列表上使用该函数与lapply。该功能目前只是向数据框添加空列。但是,如果我解决了下面的问题,我想添加它来自动填充新列(并保持对象的初始名称)。 这是我到目前为止的代码:

AAA_Metadata <- data.frame(AAA_Code=character(),AAA_REV4=character(),AAA_CONCEPT=character(),AAA_Unit=character(),AAA_Date=character(),AAA_Vintage=character())
add_empty_metadata <- function(x) {
temp_dataframe <- setNames(data.frame(matrix(ncol=length(AAA_Metadata),nrow=nrow(x))),as.list(colnames(AAA_Metadata))) 
x <- cbind(temp_dataframe,x)
}

然而,当我运行这个

a <- data.frame(matrix(ncol=6,nrow=100))
add_empty_metadata(a)

并查看全球环境 对象“a”仍然有6列而不是12列。 我知道我实际上正在处理函数中的“a”副本(基于我检查过的其他主题,例如Update data frame via function doesn't work)。所以我试过了:

x <<- cbind(temp_dataframe,x)

x <- cbind(temp_dataframe,x)
assign('x',x, envir=.GlobalEnv)

但这些都没有奏效。我想在全球环境中使用新的a以供将来参考,并保持名称'a'不变。知道我在这里做错了吗?

1 个答案:

答案 0 :(得分:0)

这是你正在寻找的东西:

addCol <- function(x, newColNames){
    for(i in newColNames){
        x[,i] <- NA
    }
    return(x)
}
a <- data.frame(matrix(ncol=6,nrow=100));dim(a)
a <- addCol(a, newColNames = names(WIS_Metadata));dim(a)

这种东西的惊人来源是Hadley Wickham的高级R和一个网站here

R对象是不可变的 - 它们不会改变 - 只是被摧毁并用同一个名称重建。 a永远不会更改 - 它被用作函数的输入,除非函数内的结果对象通过return重新分配,否则函数内部的版本(这是一个单独的环境)会被分箱功能完成。