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) : Column
varis 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))
我正在尝试创建一个自定义函数,它将在一个循环中应用,给我一个 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) : Column
varis 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))