如何编写函数以返回绘图和对象(data.frame)?
说明和目标:在R Studio中,我想定义一个函数,如果给定data.frame的列包含太多的缺失值,则该函数会删除该列,缺失值由以百分比表示的截止值定义。此函数应返回有关subseted data.frame的信息(剩余列数和缺失案例的剩余份额)以及subseted data.frame本身,以供进一步分析。此外,应该有一个选项,可以使用同名包的函数如何编写函数以返回绘图和对象(data.frame)?,r,dataframe,function,R,Dataframe,Function,说明和目标:在R Studio中,我想定义一个函数,如果给定data.frame的列包含太多的缺失值,则该函数会删除该列,缺失值由以百分比表示的截止值定义。此函数应返回有关subseted data.frame的信息(剩余列数和缺失案例的剩余份额)以及subseted data.frame本身,以供进一步分析。此外,应该有一个选项,可以使用同名包的函数vis_miss()可视化剩余的缺失案例 使用的软件包: library(tidyverse) library(vismiss) my.data
vis_miss()
可视化剩余的缺失案例
使用的软件包:
library(tidyverse)
library(vismiss)
my.data <- tibble(col_1 = c(1:5),
col_2 = c(1,2,NA,NA,NA))
cut_cols <- function(df, na.perc.cutoff, vis_miss=FALSE) {
df <- df[lapply(df, function(x) sum(is.na(x)) / length(x)) < na.perc.cutoff]
cat(paste0("Remaining cols: ", ncol(df)),
paste0("\nRemaining miss: ", paste0(round(sum(is.na(df)) / prod(dim(df)) * 100, 2), "%\n")))
if (vis_miss==TRUE) {return(vis_miss(df[1:nrow(df),c(1:ncol(df))], warn_large_data=F))}
df
}
cut_cols(my.data, 0.5, vis_miss = F) # without visualization
cut_cols(my.data, 0.5, vis_miss = T) # with visualization
数据:
library(tidyverse)
library(vismiss)
my.data <- tibble(col_1 = c(1:5),
col_2 = c(1,2,NA,NA,NA))
cut_cols <- function(df, na.perc.cutoff, vis_miss=FALSE) {
df <- df[lapply(df, function(x) sum(is.na(x)) / length(x)) < na.perc.cutoff]
cat(paste0("Remaining cols: ", ncol(df)),
paste0("\nRemaining miss: ", paste0(round(sum(is.na(df)) / prod(dim(df)) * 100, 2), "%\n")))
if (vis_miss==TRUE) {return(vis_miss(df[1:nrow(df),c(1:ncol(df))], warn_large_data=F))}
df
}
cut_cols(my.data, 0.5, vis_miss = F) # without visualization
cut_cols(my.data, 0.5, vis_miss = T) # with visualization
问题:
正如您在上面的示例中可能已经看到的,只有第一行(其中
vis_miss=F
实际返回data.frame),而不是第二行(其中vis_miss=T
)。我假设这是因为额外的if(){}
子句,它返回一个绘图,然后在不打印df
的情况下结束进程。是否有办法防止这种情况发生,以便第一行也返回新的data.frame?您正确地怀疑if(){}
子句正在阻止df打印。我认为return()
会阻止任何函数进一步运行。如果是这样的话,那么最好将它放在任何函数的末尾
此外,使用print(df)
确保函数输出数据帧。下面是对代码的一些更改
cut_cols <- function(df, na.perc.cutoff, vis_miss=FALSE) {
df <- df[lapply(df, function(x) sum(is.na(x)) / length(x)) < na.perc.cutoff]
cat(paste0("Remaining cols: ", ncol(df)),
paste0("\nRemaining miss: ", paste0(round(sum(is.na(df)) / prod(dim(df)) * 100, 2), "%\n")))
print(df)
if (vis_miss==TRUE) {return(vis_miss(df[1:nrow(df),c(1:ncol(df))], warn_large_data=F))}
}
cut_cols(my.data, 0.5, vis_miss = T)
cut\u cols您可以将结果包装在一个列表中:list(df,plot)
太棒了,谢谢!将绘图和df存储在列表中有什么好处?哦,我刚刚注意到,cut_cols()->out
不再工作,使用新函数(没有列表),可能是因为函数只是“打印”无需将其作为对象返回以供进一步分析…@Fabian的好处是能够将其存储在对象中以供以后使用或打印。你的第二个评论是什么?你是说将输出放在列表中的函数不再打印了吗?我想在管道命令中使用它,该命令当前看起来是这样的(使用列表方法):cut_cols(my.data,0.5)%>%.[1]%>%…->->新建。数据
。这是可行的。另一种方法(不将其存储在列表中)的问题是,该函数不再输出用于进一步分析的df,或者更准确地说,不再输出可以输入管道命令的df。