如何编写函数以返回绘图和对象(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

说明和目标:在R Studio中,我想定义一个函数,如果给定data.frame的列包含太多的缺失值,则该函数会删除该列,缺失值由以百分比表示的截止值定义。此函数应返回有关subseted data.frame的信息(剩余列数和缺失案例的剩余份额)以及subseted data.frame本身,以供进一步分析。此外,应该有一个选项,可以使用同名包的函数
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。