使用reshape2包和dcast时在R中出现段错误(segfault)

11
当我尝试使用dcast(来自reshape2包)重塑特定数据框时,RStudio崩溃了。我发现崩溃实际上是在R本身中发生的,所以我在R.app中运行了我的转换代码,并得到了一种类型的错误,这就是这个网站的名字:Error: segfault from C stack overflow。通过谷歌和SO的帮助,我了解到这是一种内存访问错误。
好的,我明白了,但我不知道该从哪里开始。我无法提供一个真正可重现的例子,因为我的数据框约有558,000行,而且这个问题不会在小的玩具示例上出现。例如,即使我取出数据的50,000行子集,dcast也可以很好地工作。是否有一行特定的数据引起了问题?如果是这样,有人能建议我应该查找哪些可能导致我得到此类错误的特征吗?
这是我正在转换的数据框的子集(其中一些变量的值为假值),接下来是我使用的转换函数。如果需要对其进行操作,我还在下面包含了一个小的数据段的 dput 函数。实际数据集有约700个 prog 值,15个 prog1 值和5个 fa.type 值。
  id        term   yr    nslds acad.lev    prog            prog1 fa.type amount
1  1   Fall 2009 2010 Graduate Graduate  loan 1      Other Loans    Loan   5000
2  1 Spring 2010 2010 Graduate Graduate  loan 1      Other Loans    Loan   5000
3  2   Fall 2009 2010 Graduate Graduate  loan 2    Stafford Loan    Loan   8781
4  2 Spring 2010 2010 Graduate Graduate  loan 2    Stafford Loan    Loan   8781
5  3   Fall 2007 2008 Graduate Graduate  loan 3    Stafford Loan    Loan   4250
6  3   Fall 2007 2008 Graduate Graduate grant 1 University Grant   Grant   1707

fa.wide = dcast(id + term + yr + nslds + acad.lev ~ prog1 + fa.type , data=fa, value.var="amount", fun.aggregate=sum)

这句话是R语言中的代码,大致意思是根据id、term、yr、nslds和acad.lev这几个变量对fa数据集进行重塑,并将prog1和fa.type作为列变量,将amount作为值变量,使用sum函数进行聚合。
fa = structure(list(id = c(1, 1, 2, 2, 3, 3), term = structure(c(7L, 
8L, 7L, 8L, 1L, 1L), .Label = c("Fall 2007", "Spring 2008", "Summer 2008", 
"Fall 2008", "Spring 2009", "Summer 2009", "Fall 2009", "Spring 2010", 
"Summer 2010", "Fall 2010", "Spring 2011", "Summer 2011", "Fall 2011", 
"Spring 2012", "Summer 2012", "Fall 2012", "Spring 2013"), class = c("ordered", 
"factor")), yr = c(2010L, 2010L, 2010L, 2010L, 2008L, 2008L), 
    nslds = structure(c(7L, 7L, 7L, 7L, 7L, 7L), .Label = c("1st Year, Never Attended", 
    "1st Year, Previously Attended", "2nd Year", "3rd Year", 
    "4th Year", "5th Year+", "Graduate"), class = c("ordered", 
    "factor")), acad.lev = structure(c(6L, 6L, 6L, 6L, 6L, 6L
    ), .Label = c("Freshman", "Sophomore", "Junior", "Senior", 
    "PB Undergrad", "Graduate"), class = c("ordered", "factor"
    )), prog = c("loan 1", "loan 1", "loan 2", "loan 2", "loan 3", 
    "grant 1"), prog1 = c("Other Loans", "Other Loans", "Stafford Loan", 
    "Stafford Loan", "Stafford Loan", "University Grant"), fa.type = structure(c(3L, 
    3L, 3L, 3L, 3L, 2L), .Label = c("Athletic", "Grant", "Loan", 
    "Scholarship", "Waiver", "Work/Study"), class = "factor"), 
    amount = c(5000, 5000, 8781, 8781, 4250, 1707)), .Names = c("id", 
"term", "yr", "nslds", "acad.lev", "prog", "prog1", "fa.type", 
"amount"), row.names = c(NA, 6L), class = "data.frame")

1
也许你可以将数据切成较小的块,在每个块上运行dcast,然后再将它们绑定在一起。 - N8TRO
如果必须这样做,我会尝试(或者也许我会尝试使用来自基本R或原始重塑包的不同重塑函数),但是我想为了将来的参考和在SO上拥有解决方案,以防其他人遇到类似的问题,我想深入了解这个问题的根源。 - eipi10
1
你应该在 https://github.com/hadley/reshape 上报告此问题。你可以先尝试聚合数据(使用 data.table),然后再进行宽格式重塑——如果这是导致段错误的原因,这可能会减小问题的规模。 - mnel
我已经报告了这个问题。感谢您的建议。此外,我能够使用rehshape包中的cast函数来重新整理我的数据,但我仍然想知道是什么导致了这个错误。如果@Hadley和他的团队在Github上报告了任何信息,我会在这里发布。 - eipi10
我知道这可能有点麻烦,但如果您能尝试发布一些模拟数据的代码来重现错误,那将非常有帮助。 - nograpes
显示剩余2条评论
3个回答

7

这不是一个答案,而是一个简单(无意义的)可重复的示例,不能放在评论中。您可以使用这个简单的示例(在我的MacBookPro上)重新创建此错误。

require(reshape2)
n = 1448
df <- data.frame( Student = rep( 1:n , each = 2 ) , Grade = sample( 100 , n*2 , repl = TRUE ) )
df2 <- dcast( df , Student ~ Student , value.var = "Grade" , sum )
Error: segfault from C stack overflow

错误发生在边界处 n = 1448,即当 n=1447 及以下时不会发生。看起来错误来自于包 plyr 中的 split-numeric.c 中的 split_indices。这可能与将分组级数分配给(无符号?)整数值有关,如果组数超过32767,它会导致内存访问错误,但说实话,我现在只是在猜测。

如果有人无法重现此错误,请查看我的sessionInfo():

R version 2.15.2 (2012-10-26)
Platform: x86_64-apple-darwin9.8.0/x86_64 (64-bit)

locale:
[1] en_GB.UTF-8/en_GB.UTF-8/en_GB.UTF-8/C/en_GB.UTF-8/en_GB.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] reshape2_1.2.2

loaded via a namespace (and not attached):
[1] plyr_1.8      stringr_0.6.2

有趣的是,如果我在第一次出现错误后再次运行df2 <-命令,R会完全崩溃并生成一些操作系统生成的错误报告。我在此处包含崩溃日志的相关部分:

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_PROTECTION_FAILURE at 0x00007fff5f3ff120

VM Regions Near 0x7fff5f3ff120:
    JS JIT generated code  00004d431a401000-00004d431a402000 [    4K] ---/rwx SM=NUL  
--> STACK GUARD            00007fff5bc00000-00007fff5f400000 [ 56.0M] ---/rwx SM=NUL  stack guard for thread 0
    Stack                  00007fff5f400000-00007fff5fc00000 [ 8192K] rw-/rwx SM=COW  thread 0

Application Specific Information:
objc[57147]: garbage collection is OFF

Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0   libsystem_c.dylib               0x00007fff897c4632 small_free_scan_madvise_free + 41
1   libsystem_c.dylib               0x00007fff897c5f06 szone_free_definite_size + 4186
2   libsystem_c.dylib               0x00007fff897fe789 free + 194
3   libR.dylib                      0x0000000100222dbf R_gc_internal + 7327 (memory.c:952)
4   libR.dylib                      0x0000000100224919 Rf_allocVector + 841 (memory.c:2356)
5   plyr.so                         0x000000010144bd2c split_indices + 204 (split-numeric.c:23)
6   libR.dylib                      0x00000001001b4cc7 do_dotcall + 16311 (dotcode.c:593)
7   libR.dylib                      0x00000001001e4448 Rf_eval + 1672 (eval.c:494)
8   libR.dylib                      0x00000001001e5edd do_begin + 141 (eval.c:1415)
9   libR.dylib                      0x00000001001e429c Rf_eval + 1244 (eval.c:468)
10  libR.dylib                      0x00000001001e93b1 Rf_applyClosure + 849 (eval.c:861)
11  libR.dylib                      0x00000001001e41b2 Rf_eval + 1010 (eval.c:512)
12  libR.dylib                      0x00000001001e74e5 do_set + 709 (eval.c:1717)
13  libR.dylib                      0x00000001001e429c Rf_eval + 1244 (eval.c:468)
14  libR.dylib                      0x00000001001e5edd do_begin + 141 (eval.c:1415)
15  libR.dylib                      0x00000001001e429c Rf_eval + 1244 (eval.c:468)
16  libR.dylib                      0x00000001001e93b1 Rf_applyClosure + 849 (eval.c:861)
17  libR.dylib                      0x00000001001e41b2 Rf_eval + 1010 (eval.c:512)
18  libR.dylib                      0x00000001001e74e5 do_set + 709 (eval.c:1717)
19  libR.dylib                      0x00000001001e429c Rf_eval + 1244 (eval.c:468)
20  libR.dylib                      0x00000001001e5edd do_begin + 141 (eval.c:1415)
21  libR.dylib                      0x00000001001e429c Rf_eval + 1244 (eval.c:468)
22  libR.dylib                      0x00000001001e429c Rf_eval + 1244 (eval.c:468)
23  libR.dylib                      0x00000001001e5edd do_begin + 141 (eval.c:1415)
24  libR.dylib                      0x00000001001e429c Rf_eval + 1244 (eval.c:468)
25  libR.dylib                      0x00000001001e93b1 Rf_applyClosure + 849 (eval.c:861)
26  libR.dylib                      0x00000001001e41b2 Rf_eval + 1010 (eval.c:512)
27  libR.dylib                      0x00000001001e74e5 do_set + 709 (eval.c:1717)
28  libR.dylib                      0x00000001001e429c Rf_eval + 1244 (eval.c:468)
29  libR.dylib                      0x00000001001e5edd do_begin + 141 (eval.c:1415)
30  libR.dylib                      0x00000001001e429c Rf_eval + 1244 (eval.c:468)
31  libR.dylib                      0x00000001001e93b1 Rf_applyClosure + 849 (eval.c:861)
32  libR.dylib                      0x00000001001e41b2 Rf_eval + 1010 (eval.c:512)
33  libR.dylib                      0x00000001001e74e5 do_set + 709 (eval.c:1717)
34  libR.dylib                      0x00000001001e429c Rf_eval + 1244 (eval.c:468)
35  libR.dylib                      0x000000010021c761 R_ReplDLLdo1 + 481 (main.c:362)
36  org.R-project.R                 0x0000000100022c24 run_REngineRmainloop + 196
37  org.R-project.R                 0x00000001000159b7 -[REngine runREPL] + 119
38  org.R-project.R                 0x0000000100001f24 main + 852
39  org.R-project.R                 0x0000000100001914 start + 52

@hadley 我应该提交一个错误报告吗?因为我可以重现这个崩溃。 - Simon O'Hanlon
嗨@SimonO101,你能解决这个问题吗?我在R版本3.0.1上遇到了完全相同的问题... - GodinA
1
嗯... @SimonO101,有什么建议吗?将数据框拆分成几个部分,然后再运行dcast?谢谢! - GodinA
@GodinA 目前可以使用 reshape 包中的 cast 函数。它的工作方式基本上与 dcast 相同,但不会受到段错误漏洞的影响(据我所知)。 - eipi10
它不再在R版本3.0.3上崩溃。 - djhurio
1
@djhurio 这与 R 版本更改无关,而是该软件包中的错误已经修复。请参见 Reshape fix #31 - Simon O'Hanlon

1

我在使用reshape2包中的dcast函数将长表转换为宽表时遇到了同样的问题。我在这篇帖子plyr split_indices function crashes for long vectors中找到了解决方案。具体来说,您可以在此页面https://github.com/hadley/plyr/tree/master/src中下载split_numeric.c和loop-apply.c。从R控制台卸载plyr包,最后本地重新安装该包:install.packages('/path/to/source', repos=NULL, type='source')。

这解决了我的问题,希望能对您有所帮助。


0

为了结束这个旧的问题,我们修复了一个错误,具体内容可参考this github issue


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