【发布时间】:2021-06-10 14:29:32
【问题描述】:
描述和目标:在 R Studio 中,我想定义一个函数,如果给定 data.frame 的列包含过高份额的缺失值(由截止值定义),则该函数会删除该列百分比。此函数应返回有关子集 data.frame 的信息(剩余列数和缺失案例的剩余份额)以及子集 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
问题:
正如您可能已经在上面的示例中看到的那样,只有第一行,vis_miss = F 实际上返回了 data.frame,而不是第二行,vis_miss = T。我假设这是因为额外的if () {} 子句,它返回一个绘图,然后结束该过程而不打印df。有没有办法防止这种情况发生,以便第一行也返回新的 data.frame?
【问题讨论】:
-
您可以将结果包装在一个列表中:
list(df, plot)