将 lapply 与 emmeans 列表结合使用

loc*_*cus 6 r lapply emmeans

我正在使用该emmeans软件包,但无法理解为什么它会起作用

\n
library(emmeans)\nmod <- lm(mpg ~ disp + hp, data = mtcars)\nl1 <- emmeans(mod, list("disp","hp"))\n\nfor (x in l1) {print(data.frame(x))}\n\n      disp   emmean        SE df lower.CL upper.CL\n1 230.7219 20.09062 0.5527102 29 18.96021 21.22104\n        hp   emmean        SE df lower.CL upper.CL\n1 146.6875 20.09062 0.5527102 29 18.96021 21.22104\n
Run Code Online (Sandbox Code Playgroud)\n

但这不是吗?

\n
lapply(l1, function(x) data.frame(x))\n\n Error in as.data.frame.default(x[[i]], optional = TRUE) : \ncannot coerce class \xe2\x80\x98"function"\xe2\x80\x99 to a data.frame\n
Run Code Online (Sandbox Code Playgroud)\n

使用普通列表,我得到预期的输出(列表中的数据帧):

\n
l2 <- list(a=matrix(c(1,2,3,4)), b=matrix(c(5,6,7,8)))\nlapply(l2, function(x) data.frame(x))\n$a\n  x\n1 1\n2 2\n3 1\n4 3\n\n$b\n  x\n1 4\n2 5\n3 4\n4 6\n
Run Code Online (Sandbox Code Playgroud)\n

akr*_*run 3

它确实将类从修改emmGridlistlapply

\n
> lapply(l1, class)\n$`emmeans of disp`\n[1] "list"\n\n$`emmeans of hp`\n[1] "list"\n
Run Code Online (Sandbox Code Playgroud)\n

相反,循环序列和提取不会

\n
> lapply(seq_along(l1), \\(i) class(l1[[i]]))\n[[1]]\n[1] "emmGrid"\nattr(,"package")\n[1] "emmeans"\n\n[[2]]\n[1] "emmGrid"\nattr(,"package")\n[1] "emmeans"\n
Run Code Online (Sandbox Code Playgroud)\n

因此,as.data.frame.list将应用于 的所有元素list(可能具有不同的结构、长度等)。一个选项是as_tibble使用map

\n
library(tibble)\nlibrary(purrr)\n> map(l1, as_tibble)\n$`emmeans of disp`\n# A tibble: 1 \xc3\x97 6\n   disp emmean    SE    df lower.CL upper.CL\n  <dbl>  <dbl> <dbl> <dbl>    <dbl>    <dbl>\n1  231.   20.1 0.553    29     19.0     21.2\n\n$`emmeans of hp`\n# A tibble: 1 \xc3\x97 6\n     hp emmean    SE    df lower.CL upper.CL\n  <dbl>  <dbl> <dbl> <dbl>    <dbl>    <dbl>\n1  147.   20.1 0.553    29     19.0     21.2\n
Run Code Online (Sandbox Code Playgroud)\n