我正在使用该emmeans软件包,但无法理解为什么它会起作用
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\nRun Code Online (Sandbox Code Playgroud)\n但这不是吗?
\nlapply(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\nRun Code Online (Sandbox Code Playgroud)\n使用普通列表,我得到预期的输出(列表中的数据帧):
\nl2 <- 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\nRun Code Online (Sandbox Code Playgroud)\n
它确实将类从修改emmGrid为listlapply
> lapply(l1, class)\n$`emmeans of disp`\n[1] "list"\n\n$`emmeans of hp`\n[1] "list"\nRun 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"\nRun Code Online (Sandbox Code Playgroud)\n因此,as.data.frame.list将应用于 的所有元素list(可能具有不同的结构、长度等)。一个选项是as_tibble使用map
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\nRun Code Online (Sandbox Code Playgroud)\n