如何在数据框列表上 lapply() 公式。或如何在数据帧列表上执行 kruskal.test()

Posted

技术标签:

【中文标题】如何在数据框列表上 lapply() 公式。或如何在数据帧列表上执行 kruskal.test()【英文标题】:How to lapply() a formula over a dataframe list. or how to perform kruskal.test() over a list of dataframes 【发布时间】:2021-10-22 18:56:18 【问题描述】:

所以我有这个数据并尝试在包含数据帧的列表上执行kruskal.test()

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
    )
)

我正在尝试对这 3 个数据帧执行kruskal.test,但在尝试找到解决方案数小时后失败了。我是 R 新手。

失败的尝试是:

snake <- function(i)
  kruskal.test(df$Height ~ df$Person, data = i)

snail <- lapply(df_list, "[[", snake)


df_list %>% kruskal.test(df$Height ~ df$Person)

sapply(df_list, function(i)  kruskal.test(df$Height ~ df$Person, data = i))


Map(function(x) kruskal.test(Height ~ Person), get(df_list))

Map(function(df_list, .f(kruskal.test(Height ~ Person)))

lapply(mget(df_list), function(x) kruskal.test(Height ~ Person))

bunny <- df_list %>%
  kruskal_test(df$Height ~ Person, data = .)

总结:我正在尝试对一组包含数据帧的列表执行kruskal.test()。如何通过lapply()Map() 传递公式以在列表中的每个数据帧中运行kruskal.test()

【问题讨论】:

【参考方案1】:

您的代码引用了一个名为“df”的对象,该对象似乎不存在。此外,当使用kruskal.test 和参数kruskal.test(formula, data) 时,无需在公式中引用数据框。提供kruskal.test 一个“数据”参数将导致函数首先在提供的数据中搜索公式符号。换句话说,如果数据框“x”包含列“Height”和“Person”,那么以下内容将起作用:

kruskal.test(Height ~ Person, data = x)

在您的示例中,您不应引用df。请注意,下面的代码使用名为“i”的参数创建了一个临时函数,并且随后引用了“i”:

lapply(df_list, function(i) kruskal.test(Height ~ Person, data = i))

$`1.3.A`

    Kruskal-Wallis rank sum test

data:  Height by Person
Kruskal-Wallis chi-squared = 5, df = 2, p-value = 0.08208


$`2.2.A`

    Kruskal-Wallis rank sum test

data:  Height by Person
Kruskal-Wallis chi-squared = 5, df = 2, p-value = 0.08208


$`1.1.B`

    Kruskal-Wallis rank sum test

data:  Height by Person
Kruskal-Wallis chi-squared = 5, df = 2, p-value = 0.08208

【讨论】:

Purrr/Tidyverse 版本:map(df_list, ~kruskal.test(Height ~ Person, data = .)) @jdobres 非常感谢!!你是救生员!!在我的脑海中,我正在参考这份清单。非常感谢您的解释。现在,我很难在何时或何时不引用 R 中给定函数中的特定参数。 @andrew_reece,也感谢您提供此解决方案。 :)

以上是关于如何在数据框列表上 lapply() 公式。或如何在数据帧列表上执行 kruskal.test()的主要内容,如果未能解决你的问题,请参考以下文章

如何修改多个数据框而不列出它们然后使用 lapply?

如何在 ffdf 中使用 apply 或 sapply 或 lapply?

如何在 R 中使用 lapply 消除异常

如何使用lapply来计算r中列表中的唯一值

使用R语言将不同长度的向量合并为数据框

如何在此数据框列的 R 中正确使用 apply?