我正在编写一个简单的函数,它将创建一个新变量,其中包含数据集中每列缺失值的总和。我正在使用assign
函数根据函数的输入分配变量名称。
report.NA <- function(v){
nam <- deparse(substitute(v))
newvar <-paste0(nam,"NAs")
as.data.frame(assign(newvar,colSums(is.na(v)),envir=parent.frame()))
message(paste("Sum of NAs in",nam,"dataset:",newvar),appendLF=FALSE)
}
为了再现性:
set.seed(1)
df<-matrix(1,nrow=10,ncol=5)
dimnames(df)<-list(rownames(df),colnames(df,do.NULL=F))
df[sample(1:length(d), 10)] <- NA
在df
上运行该功能,您将获得一个名为dfNAs
的新变量。
> dfNAs
col1 col2 col3 col4 col5
2 2 3 0 3
我遇到的问题是我希望将输出变量作为data.frame
类型。我知道在函数之外执行此操作的显而易见的方法是运行as.data.frame(dfNAs)
但我希望函数本身从assign
生成新变量作为数据框。我只是想看看是否有解决这个问题的方法。
另外一个重要的问题是如何调用嵌套在函数中的assign
名称,以便它甚至可能?我似乎是一个天真的问题,但我还没有找到答案。
答案 0 :(得分:0)
不确定我理解了什么是理想的,但这种改造可能会指向一个有利的方向。使用as.list将命名向量转换为多元素命名列表,普通data.frame
函数可以接受该列表来生成多个列:
report.NA <- function(v){
nam <- deparse(substitute(v))
newvar <-paste0(nam,"NAs")
assign(newvar,data.frame(as.list(colSums(is.na(v)))),envir=parent.frame())
message(paste("Sum of NAs in",nam,"dataset:",newvar),appendLF=FALSE)
}
report.NA(df)
#Sum of NAs in df dataset: dfNAs
> dfNAs
col1 col2 col3 col4 col5
1 2 2 3 0 3
> str(dfNAs)
'data.frame': 1 obs. of 5 variables:
$ col1: num 2
$ col2: num 2
$ col3: num 3
$ col4: num 0
$ col5: num 3