purrr语法的清晰度

11

在使用purrr时,我经常发现自己在变量命名方面做出错误的选择。

例如,请参考purrr的github页面上的代码。

library(purrr)

mtcars %>%
  split(.$cyl)

split(.$cyl)中,我经常犯使用split(cyl)的错误。这似乎是最明显的选择,因为它与其他tidyverse命令(如select(cyl))一致。

我的问题是为什么在变量名前面加上.$


1
split()是一个基本的R函数,不遵循构建在tidyverse函数中的逻辑和原则。您的示例代码中没有purrr函数调用。 - Kresten
1个回答

11
. 代表数据对象,通过使用 $ 来提取该列。它还可以接收
mtcars %>%
    split(.[['cyl']]

mutate/summarise/group_by/select/arrange 等函数中,我们可以简单地传递列名,但是对于 split 函数来说情况有所不同,因为它是一个 base R 函数,除非我们提取列,否则它无法找到 'cyl' 列所在的数据集环境。

tidyverse 中,我们可以选择将除 'cyl' 外的所有其他变量都用 nest 函数嵌套起来。

mtcars %>%
    nest(-cyl) 

现在我们有一个名为"data"的list列,其中包含所有其他列作为'data.frame'的list


使用新版本的dplyr(已测试过0.8.1),可以使用group_split,正如@Moody_Mudskipper所评论的那样。

mtcars %>%
       group_split(cyl)

我本以为我了解这个概念,所以我试图向前迈进一小步,并进行了以下操作:mtcars %>% nest(-cyl) %>% mutate(model = map(data,cyl_model)) %>% map(.x = .$model , .f = summary),结果出现了错误:“Error in if (correlation) { : argument is not interpretable as logical”。 在我看来,.$model是有意义的,因为我将其传递给了基本的R函数summary - Alex
2
@Alex 你的意思是 mtcars %>% nest(-cyl) %>% mutate(Summary = map(data, ~ lm(mpg ~ wt, data = .x) %>% summary)) %>% .$Summary - akrun
1
@Alex mtcars 是整个数据集,如果你将其作为对象传递,它将查找整列而不是拆分或嵌套的部分。 - akrun
1
@Alex 在你的匿名函数调用 cyl_model <- function(df) { lm(mpg ~ wt, data = df) } 中,你调用了 df 然后是 data = mtcars,应该改为 data = df - akrun
2
要在这里获得类似的输出,我们可以使用 dplyr::group_split,例如 mtcars %>% group_split(cyl)。但是元素将不会被命名。 - moodymudskipper
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接