我正在尝试创建一个自定义函数,该函数将在循环中应用,为我提供一个表,其中包含我表中所有变量所需的所有信息。我的函数基于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) : Column
var is of unsupported type NULL
)。它适用于我的数据框,我对它进行了子集化,它仍然运行良好,我通过在同一个类中手动编写所有相同的值再次手动创建它,它没有工作......所以我真的迷路了,不明白为什么它适用于我的数据集,但没有其他,因为我是 R 的新手,只是通过尝试学习这一点,没有关于这种语言代码的讲座,我有时不知道我真正在做什么,但它工作(就像我上面的这段代码),然后就没有了......
所以这段代码对我来说效果很好,只是说问题是因为我使用n_distinct(x[, y])
它忽略了na.rm=TRUE
,我无法理解。
抱歉,我问了一个相当不全面的问题,如果您对如何澄清它发表评论,我会很高兴编辑它。我完全迷失了我的尝试,不知道如何以更清晰的方式呈现事物。感谢您的帮助,并为混乱感到抱歉