0

我正在尝试创建一个自定义函数,该函数将在循环中应用,为我提供一个表,其中包含我表中所有变量所需的所有信息。我的函数基于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似乎没有看到。

然后,我的目标将是带有一些循环的苹果,为我的数据框的每个变量创建一个包含一行的表,然后我可以导出该表,以便在一个表中包含所有变量的这些信息。

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

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) : Columnvar is of unsupported type NULL)。它适用于我的数据框,我对它进行了子集化,它仍然运行良好,我通过在同一个类中手动编写所有相同的值再次手动创建它,它没有工作......所以我真的迷路了,不明白为什么它适用于我的数据集,但没有其他,因为我是 R 的新手,只是通过尝试学习这一点,没有关于这种语言代码的讲座,我有时不知道我真正在做什么,但它工作(就像我上面的这段代码),然后就没有了......

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

抱歉,我问了一个相当不全面的问题,如果您对如何澄清它发表评论,我会很高兴编辑它。我完全迷失了我的尝试,不知道如何以更清晰的方式呈现事物。感谢您的帮助,并为混乱感到抱歉

4

1 回答 1

1

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

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

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))
于 2017-08-12T18:16:16.033 回答