R自定义函数应用于数据框中的所有变量

R custom function to apply to all variables in a dataframe

我正在尝试创建一个自定义函数,它将在一个循环中应用,给我一个 table,其中包含我 table 的所有变量所需的所有信息。我的函数基于 dplyr 函数和 base.

myfun <- function(x, y) summarise(x, var=names(x[y]), n=sum(!is.na(y)), blank=n()-sum(!is.na(y)), distinct=n_distinct(y, na.rm=TRUE))

我的问题是base函数(names())需要给y参数(变量名)加上引号,但是dplyr函数n_distinct 需要简单地没有引号才能用 na.rm=TRUE 给出正确答案(如果我使用 n_distinct(x[y], na.rm=TRUE) 它不会给我一个没有 NA 值的结果)。所以我不知道如何找到一个解决方案来使 y 参数的良好形式传递给两个函数。我已经尝试将 \" 用于 names() 函数,但它似乎没有用。这是我得到的错误:

myfun <- function(x, y) summarise(x, var=names(x[y]), n=sum(!is.na(y)), blank=n()-sum(!is.na(y)), distinct=n_distinct(y, na.rm=TRUE))
myfun(mtcars, "cyl")

错误:Error in summarise_impl(.data, dots) : variable 'y' not found

myfun <- function(x, y) summarise(x, var=names(x[y]), n=sum(!is.na(y)), blank=n()-sum(!is.na(y)), distinct=n_distinct(y, na.rm=TRUE))
myfun(mtcars, cyl)

错误:Error in summarise_impl(.data, dots) : Evaluation error: object 'cyl' not found.

myfun <- function(x, y) summarise(x, var=names(x[y]), n=sum(!is.na(x[y])), blank=n()-sum(!is.na(x[y])), distinct=n_distinct(x[y], na.rm=TRUE))
myfun(mtcars, "cyl")

没有错误,但是na.rm=TRUE好像没看到

然后我的目标是使用一些循环为我的数据框的每个变量制作一个 table 行,然后我可以导出这些信息以将所有变量的这些信息放在一个 table.

我试图制作一个最小的可重现示例:

library(dplyr)
myfun <- function(x, y) summarise(x, var=names(x[, y]), n=sum(!is.na(x[, y])), blank=n()-sum(!is.na(x[, y])), n_distinct=n_distinct(x[, y], na.rm=TRUE))
a <- mtcars%>%
  summarise(n=sum(!is.na(cyl)), blank=n()-sum(!is.na(cyl)), n_distinct=n_distinct(cyl, na.rm=TRUE))
a <- lapply(colnames(mtcars), function(x) data.frame(bind_rows(a, myfun(mtcars, x))))
a <- data.frame(bind_rows(a, myfun(mtcars, "cyl")))
a <- a%>%
  filter(!is.na(var))%>%
  distinct(var, .keep_all=TRUE)

但由于某些不可理解的原因(至少对我而言)它不起作用(第 a <- lapply(colnames(mtcars), function(x) data.frame(bind_rows(a, myfun(mtcars, x)))) 行,错误消息 Error in summarise_impl(.data, dots) : Columnvaris of unsupported type NULL)。它适用于我的数据框,我对它进行了子集化,但它仍然可以正常工作,我通过在同一个 class 中手写所有相同的值,再次手动创建相同的数据框,它没有用......所以我'我真的迷路了,不明白为什么它适用于我的数据集但不适用于其他数据集,而且因为我是 R 的新手并且只是通过尝试学习,没有关于这种语言代码的讲座,我有时不知道我在做什么确实在做,但它有效(就像上面的这段代码对我来说),然后就没有了……

所以这段代码对我来说很好用,只是有问题,因为我使用 n_distinct(x[, y]) 它忽略了 na.rm=TRUE,我无法理解。

对于我提出的相当不全面的问题,我深表歉意,如果您留下关于如何澄清它的评论,我将很乐意对其进行编辑。我只是完全迷失了自己的尝试,不知道如何以更清晰的方式呈现事物。感谢您的帮助,很抱歉弄得一团糟

我不完全清楚你到底想做什么,但这可能会成功。

首先为每一列创建一个函数运行。

fn <- function(x){
    a = levels(x)
    n = n=sum(!is.na(x))
    blank = length(x) - sum(!is.na(x))
    dist = length(unique(x))
    c(column = a, n=n, blank=blank, distinct=dist )
}

然后使用 apply 将函数应用于 data.frame 的每一列。我已将其调换以提供行。

t(apply(mtcars, 2, fn))