在使用purrr
时,我经常发现自己在变量命名方面做出错误的选择。
例如,请参考purrr的github页面上的代码。
library(purrr)
mtcars %>%
split(.$cyl)
在split(.$cyl)
中,我经常犯使用split(cyl)
的错误。这似乎是最明显的选择,因为它与其他tidyverse
命令(如select(cyl)
)一致。
我的问题是为什么在变量名前面加上.$
。
.
代表数据对象,通过使用 $
来提取该列。它还可以接收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
。 - Alexmtcars %>% nest(-cyl) %>% mutate(Summary = map(data, ~ lm(mpg ~ wt, data = .x) %>% summary)) %>% .$Summary
。 - akrunmtcars
是整个数据集,如果你将其作为对象传递,它将查找整列而不是拆分或嵌套的部分。 - akruncyl_model <- function(df) { lm(mpg ~ wt, data = df) }
中,你调用了 df
然后是 data = mtcars
,应该改为 data = df
。 - akrundplyr::group_split
,例如 mtcars %>% group_split(cyl)
。但是元素将不会被命名。 - moodymudskipper
split()
是一个基本的R函数,不遵循构建在tidyverse
函数中的逻辑和原则。您的示例代码中没有purrr
函数调用。 - Kresten