在r中的多列(变量)上使用函数

Posted

技术标签:

【中文标题】在r中的多列(变量)上使用函数【英文标题】:use function on multiple columns (variables) in r 【发布时间】:2020-05-27 12:48:11 【问题描述】:

我正在尝试使用 car 包中的 leveneTest 函数运行方差同质性测试。我可以像这样在单个变量上运行测试(以 iris 数据集为例)

library(car)
library(datasets)

data(iris)

leveneTest(iris$Sepal.Length, iris$Species)

但是,我想同时对数据集中的所有因变量进行测试(例如 Sepal.Length、Sepal.Width、Petal.Length、Petal.Width)。我猜它与 apply 系列函数(sapply、lapply、tapply)有关,但我就是不知道怎么做。我最接近的是这样的:

lapply(iris, leveneTest(group = iris$Species))

但是我得到了错误

Error in leveneTest.default(group = iris$Species) : 
  argument "y" is missing, with no default

我的理解可能是因为它无法指定结果变量。我确定我一定错过了应用函数的一些明显用途,但我只是不明白它是什么。为基本问题道歉,但我对 R 相对较新,并且经常将相同的函数应用于多个变量(通常通过多次复制代码),所以了解如何正确使用这些函数会很棒:)

【问题讨论】:

【参考方案1】:

函数的常用参数需要在lapply内传递给...。像这样:

lapply(subset(iris, select = -Species), leveneTest, group = iris$Species)

help("lapply") 解释说... 用于“FUN 的可选参数”(意思是lapply 不是FUN 的可选参数)并提供lapply(x, quantile, probs = 1:3/4) 作为示例。

【讨论】:

【参考方案2】:

根据@Roland 的回答,您也可以在基础 R 中执行以下操作:

lapply(iris[,-5], leveneTest, group = iris$Species

-5 显然特定于 iris 数据集。您可以将其替换为类似

的变量
lapply(iris[,-length(iris)]....

这会让你删除 df 的最后一个元素,假设你的分组变量是最后一个。

另外,作为 data.table 的粉丝,如果您有兴趣,我会添加一个选项供您使用。

dt.iris[, lapply(.SD, leveneTest, group = Species), .SDcols = !'Species']

此代码使您能够以与上述基本 R 示例类似的方式从 lapply 函数中“删除” Species 列,但通过 .SD 和 .SDcols 变量显式命名。然后你以相当直接的方式运行你的分析。希望这会有所帮助!

【讨论】:

我只想说我的答案没有使用dplyr。我不确定你是否在暗示这一点。 我的错误,我以为您的答案中包含了 dplyr 函数,但显然我需要检查我的处方。相应地更新了我的帖子,对此感到抱歉

以上是关于在r中的多列(变量)上使用函数的主要内容,如果未能解决你的问题,请参考以下文章

R:填写多列

函数将多列作为单列而不是多列返回

具有从 R 到 Latex 的行和多列列名的简单交叉表

R语言tidyr包separate()函数实战详解:一列裂变为多列

r 将函数行方式应用于多列

根据给定的因子在 R 中按函数分组获取多列的百分比值