【问题标题】:dplyr crashes when using summarise with segfault error使用带有段错误的汇总时 dplyr 崩溃
【发布时间】:2015-08-10 09:04:30
【问题描述】:

我的dplyr 脚本有时会在此代码段中崩溃:

abc.fit <- abc_bySubject %>%
  do(fit = lm(value ~ delta, .)) %>%
  summarise(fvc_intercept = coef(fit)[1],
        fvc_slope = coef(fit)[2])

崩溃错误是:

 *** caught segfault ***
address 0x7ff041000098, cause 'memory not mapped'

但是,当我在 Rstudio 中执行此部分并出现错误 fatal error - R Session Aborted 时也会发生这种情况,但频率较低。当我在 R 命令行中获取脚本时,它总是会发生。 我在具有大量 RAM 的不同机器上对其进行了测试。 R 和所有软件包都是最新的,我使用的是最新版本的 Ubuntu。

可能与这个问题有关:link 但它说这是固定的。

也许有更好的解决方案

【问题讨论】:

  • 没有数据(请模拟),这几乎是不可能调试的。你能做一个最小的工作示例吗?
  • 我在设置时遇到了dplyr-0.4.2 的问题,所以我使用的是 0.4.1 没有问题。如果你manually downgrade你的dplyr版本,你能重现错误吗?
  • @r2evans 我真的不喜欢降级,你知道 github 上的 dev 版本是否还会出现这种情况吗?
  • 不确定;它在1302 中报告为已修复,但我在编译它时遇到了问题(与1306 不同)。我之前用 0.4.2.9002 尝试过,但没有修复,但那是几周前的事了。

标签: r dplyr


【解决方案1】:

另一个不使用summarise(OP 的代码在dplyr_0.4.1.9000 中工作)来获得预期输出的选项是从lm 中提取coef,将其转换为list,更改“名称”列出元素 (setNames) 并在 do 环境中转换回 data.frame

library(dplyr)
abc.fit <- abc_bySubject %>%
                do(data.frame(setNames(as.list(coef(lm(value~delta, data=.))),
                            c('fvc_intercept','fvc_slope' ))))

abc.fit
#    Subject fvc_intercept   fvc_slope
#1       1     0.5319503 -0.03147698
#2       2     0.4478791  0.04293860
#3       3     0.4318059 -0.03276570

如果我们需要删除“主题”列,我们可以ungroup() 并使用select 选择除“主题”以外的列

abc.fit %>% 
      ungroup() %>%
      select(-Subject)
#  fvc_intercept   fvc_slope
#1     0.5319503 -0.03147698
#2     0.4478791  0.04293860
#3     0.4318059 -0.03276570

另一个选项是data.table。我们将'data.frame'转换为'data.table'(setDT(abc)),按'Subject'列分组,我们得到lm的系数(coef),转换为list(@987654338) @) 并设置列的名称 (setnames)。

 library(data.table)
 res <- setnames(setDT(abc)[, as.list(coef(lm(value~delta))),
               by =Subject],2:3, c('fvc_intercept', 'fvc_slope'))[]
 res
 #   Subject fvc_intercept   fvc_slope
 #1:       1     0.5319503 -0.03147698
 #2:       2     0.4478791  0.04293860
 #3:       3     0.4318059 -0.03276570

我们可以从 'res' 中对感兴趣的列进行子集化

res[,-1, with=FALSE]
#   fvc_intercept   fvc_slope
#1:     0.5319503 -0.03147698
#2:     0.4478791  0.04293860
#3:     0.4318059 -0.03276570

数据

set.seed(24)
abc <- data.frame(Subject= rep(1:3,each=10), delta=rnorm(30), value=runif(30))
abc_bySubject <- group_by(abc, Subject)

【讨论】:

  • 谢谢,这似乎确实修复了 ist。但是感觉这有点慢,它还包括我必须手动删除的 abc_SubjectID 的 ID 列。这只是一个小问题,所以我对这个解决方案很满意。
  • @spore234 我添加了data.table 选项。它应该很快。
  • @spore234 您的代码与dplyr_0.4.1.9000 配合得很好
猜你喜欢
  • 2020-01-26
  • 1970-01-01
  • 2021-10-14
  • 2014-02-16
  • 2019-01-25
  • 1970-01-01
  • 2018-04-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多