通过用户定义的函数向数据框添加列
Posted
技术标签:
【中文标题】通过用户定义的函数向数据框添加列【英文标题】:Adding columns to data frame via user-defined function 【发布时间】:2017-09-19 15:39:21 【问题描述】:我正在尝试向多个数据框添加列。我正在尝试创建一个将添加列的函数,然后我想将该函数与 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”不变。知道我在这里做错了什么吗?
【问题讨论】:
函数末尾需要return(x)
声明吗?
@screechOwl return(x) 将打印预期结果,但不会将“新” a 添加到全局环境中。但你是对的,我忘了提到我希望能够重用/引用附加的数据框。
AAA_Metadata = WIS_Metadata 吗?
@screechOwl Oups 不错不错!
【参考方案1】:
这是你要找的吗:
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 的 Advanced R,其网站为 here。
R 对象是不可变的 - 它们不会改变 - 只是被销毁并以相同的名称重建。 a
永远不会改变 - 它被用作函数的输入,除非函数内的结果对象通过 return
重新分配,否则函数内的版本(这是一个单独的环境)在函数完成时被装箱.
【讨论】:
我认为这很接近,我认为我的问题需要更准确。 如何将其应用于多个数据帧? (可能使用 lapply 或 mapply)newDataFrame <- addCol(newDataFrame, newColNames)
应该可以工作,只要 newDataFrame 是 data.frame 并且 newColNames 是字符向量。以上是关于通过用户定义的函数向数据框添加列的主要内容,如果未能解决你的问题,请参考以下文章