【问题标题】:lapply() showed two different results when using with leveneTest()lapply() 与 leveneTest() 一起使用时显示了两个不同的结果
【发布时间】:2021-10-23 05:48:36
【问题描述】:

我有这个包含不同数据帧的数据帧列表。

df_list <- list(
  `1.3.A` = 
    tibble::tribble(
      ~Person, ~Height, ~Weight,
      "Alex",    175L,     75L,
      "Gerard",    180L,     85L,
      "Clyde",    179L,     79L,
      "Alex",    175L,     75L,
      "Gerard",    180L,     85L,
      "Clyde",    179L,     79L

    ),
  `2.2.A` = 
    tibble::tribble(
      ~Person, ~Height, ~Weight,
      "Alex",    175L,     75L,
      "Gerard",    180L,     85L,
      "Clyde",    179L,     79L,
       "Alex",    175L,     75L,
      "Gerard",    180L,     85L,
      "Clyde",    179L,     79L
    ), 
  `1.1.B` = 
    tibble::tribble(
      ~Person, ~Height, ~Weight,
      "Alex",    175L,     75L,
      "Gerard",    180L,     85L,
      "Clyde",    179L,     79L,
      "Alex",    175L,     75L,
      "Gerard",    180L,     85L,
      "Clyde",    179L,     79L
    )
)

我试图做的是测试组间方差的同质性(在这种情况下是人)。但是经过几次管道 lapply() 与 leveneTest() 的试验后,我的代码显示了两个不同的结果。

这个特定的代码有效并给了我想要的结果。

ht <- function(df){ 
  leveneTest(df$Height ~ df$Person)
}

final_ht <- lapply(df_list, ht)

但是,对于这段代码

wood <- lapply(df_list, function(i) ~leveneTest(y = Height, group = Person, data = i))

会给出显示&lt;environment: 0x55869b4289b8&gt;的结果

我不知道为什么wood 中的函数没有返回或运行 leveneTest。 两个代码中的lapply() 发生了什么? 有人可以告诉我lapply() 在这两种情况下都做了什么吗?

另外,在代码ht 中它会返回一个警告,这样可以吗?

In leveneTest.default(y = y, group = group, ...) : 
group coerced to factor. Error in cat("1: In leveneTest.default(y = y, 
group = group, ...) : group coerced to factor.",  : 
  argument 2 (type 'list') cannot be handled by 'cat'

非常感谢任何帮助。

【问题讨论】:

  • 不要使用function(i) ~leveneTest(..),您正在混合基本 R 和 rlang/purrr 波浪号函数的概念(它们不兼容)。删除波浪号,只需使用function(i) leveneTest(...)
  • 仅供参考,~ 返回一个公式/表达式,其中存储了调用表达式的环境,这就是您看到 &lt;environment:...&gt; 的原因。
  • 对不起,我是 R 新手。~ 在基础 R 和 purrr 中做了什么?这是否意味着我不能将基本 R 与其他库混合?还是不能将两个库混合在一起?
  • 您通常可以混合库,但基本 R 不使用 rlang~-function 语法。最接近的是 R-4.1 新引入的 \(x) somefunc(x) 以缩短 function(x) somefunc(x) 一些,几乎完全用于代码高尔夫(更少字符)目的。

标签: r list function lapply


【解决方案1】:

去掉波浪号,如

wood <- lapply(df_list, function(i) leveneTest(y = Height, group = Person, data = i))

如果您使用的是purrr(或其他一些rlang 派生的函数集),那么您可以将其用作:

purrr::map(df_list, ~ leveneTest(y = Height, group = Person, data = .x))
# or
purrr::map(df_list, ~ leveneTest(y = Height, group = Person, data = .))

在基础 R 中,波浪号返回一个公式/表达式,其中存储了调用表达式的环境,这就是您看到 &lt;environment:...&gt; 的原因。在base R中,常用于定义响应与模型变量的关系,如lm(mpg ~ disp + cyl, data=mtcars);它也可以用来定义边际变量,如xtabs(~ cyl + vs, data = mtcars)。在这两种情况下都没有使用实际的调用环境(与~ 一起存储),但它仍然存在。

purrr 中,可以更简洁地定义匿名函数。以下内容在大多数情况下是等效的:

lapply(df_list, function(dat) leveneTest(y = Height, group = Person, data = dat))
purrr::map(df_list, function(dat) leveneTest(y = Height, group = Person, data = dat))
purrr::map(df_list, ~ leveneTest(y = Height, group = Person, data = .))
purrr::map(df_list, ~ leveneTest(y = Height, group = Person, data = .x))
# new to R-4.1
lapply(df_list, \(dat) leveneTest(y = Height, group = Person, data = dat))

【讨论】:

    猜你喜欢
    • 2016-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-19
    • 2015-10-31
    • 2019-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多