使用purrr映射dplyr::select时R崩溃的问题求助
问题原因与解决方法
你遇到的段错误(segfault)是因为在mutate里错误地使用了公式写法~map(...)——~是用来创建公式对象的,通常是在purrr函数内部作为.f参数的简写(比如map(.x, ~do_something(.x))),但直接把~map(...)放在mutate的赋值右侧,会导致内部处理时出现内存映射错误,进而让R崩溃。
正确的两种写法
你只需要调整mutate里的map调用方式,以下两种写法都能正常运行:
写法1:利用map的参数传递特性
直接把select作为map的第二个参数,后面跟上select的参数(移除mpg列),map会自动把data列里的每个嵌套数据框作为第一个参数传给select:
library(tidyverse) mtcars %>% group_by(cyl) %>% nest() %>% mutate(data2 = map(data, dplyr::select, -mpg))
写法2:在map内部使用公式简写
如果习惯用公式写法,要把~放在map的函数参数位置,用.x指代每个迭代的嵌套数据框:
library(tidyverse) mtcars %>% group_by(cyl) %>% nest() %>% mutate(data2 = map(data, ~dplyr::select(.x, -mpg)))
写法3(R 4.1+):使用匿名函数
如果你用的是R 4.1及以上版本,也可以用更直观的匿名函数写法:
library(tidyverse) mtcars %>% group_by(cyl) %>% nest() %>% mutate(data2 = map(data, \(df) select(df, -mpg)))
验证结果
运行任意一种写法后,你都会得到预期的三列数据框:
cyl:分组的气缸数data:原始的嵌套数据框data2:移除了mpg列的嵌套数据框
内容的提问来源于stack exchange,提问作者ohnoplus
相关产品推荐
相关产品推荐

