将一个名称从assign()强制转换为函数R中的特定数据类型

时间:2017-01-09 23:16:28

标签: r function

我正在编写一个简单的函数,它将创建一个新变量,其中包含数据集中每列缺失值的总和。我正在使用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名称,以便它甚至可能?我似乎是一个天真的问题,但我还没有找到答案。

1 个答案:

答案 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