我有一个数据框,其中包含一堆嵌套的数据框,我想将dplyr :: select应用于每个嵌套数据框 . 这是一个例子
library(tidyverse)
mtcars %>%
group_by(cyl) %>%
nest %>%
mutate(data2 = ~map(data, dplyr::select(.,-mpg)))
我认为这会产生一个包含三列的数据框 . cyl
:柱面数 data
:嵌套数据 data2
:与数据相同,但每个元素都没有mpg列 .
相反,R崩溃:
抓到了段落
地址0x7ffc1e445000,导致'内存未映射'
追溯:
1:.Call(_dplyr_mutate_impl
,df,dots)
2:mutate_impl(.data,dots)
3:mutate.tbl_df( . ,data2 = ~map(data,dplyr :: select( . , - mpg)))
4:mutate( . ,data2 = ~map(data,dplyr :: select( . , - mpg)))
5:function_list [[k]](value)
6:withVisible(function_list [[k]](value))
7:freduce(value,_ function_list
)
8:_fseq
(_lhs
)
9:eval(quote(_fseq
(_lhs
)),env,env)
10:eval(quote(_fseq
(_lhs
)),env,env)
11:withVisible(eval(quote(_fseq
(_lhs
)),env,env))
12:mtcars%>%group_by(cyl)%>%nest%>%mutate(data2 = ~map(data,dplyr :: select( . , - mpg)))
可能的行动:
1:中止(使用核心转储,如果启用)
2:正常R退出
3:退出R而不保存工作区
4:退出R保存工作区
我意识到如果我在嵌套之前应用选择操作,我可以获得我想要的列,但这与我真正的问题不太相似 . 有人可以向我解释我在这里做错了什么吗?谢谢你的建议 .
2 回答
你需要将
~
从map
移到select
;或者将评论用作@Russ;函数(在本例中为purrr::map
)接受公式作为参数时使用~
:这里有两种方式:一种是跳过嵌套,只使用
do
,一种是嵌套,然后使用map
.unnest(data2)
然后将其恢复为常规数据框 . 需要注意的一点是,我在第一个例子中的select
中包含了-cyl
;这是因为否则,你最终得到cyl
两次,一次来自分组列,一次是来自未建模的数据框 .除了个人偏好之外,我不确定其中一种方法是否优于另一种方式 .
由reprex package(v0.2.0)创建于2018-05-11 .