首页 > 解决方案 > 错误:SET_STRING_ELT() 的值必须是 'CHARSXP' 而不是 dplyr group_by 中的“字符”

问题描述

如下使用group_by时出现超级随机错误dplyr

dat %>% group_by(variable) %>% mutate(score = score[1])

其中dat是一个data.frame带有因子/字符的列variable并且score是一个双精度。我得到的错误是这样的:

Value of SET_STRING_ELT() must be a 'CHARSXP' not a 'character'

这让我疯狂...

我用谷歌搜索了这个错误并找不到很好的帮助,除了缩小范围,这就是我所做的,即一个简单的group_by计算。此外,我重新启动了 R 会话,重新启动计算机,更新了我的 R 版本和dplyr包,现在是 1.07 版。我在 Ubuntu 20.04.3 LTS 上使用 R 版本 4.1.1。

关于可能产生此错误的任何想法?

编辑 我无法提供带有模拟数据的可重现样本,因为它只发生在特定数据中。在这里,我上传了导致错误的数据https://filebin.net/9pywc544hsmgm2p3

然后运行以下代码

A <- readRDS("dat.rds") %>% 
    group_by(variable) %>% 
    mutate(score = score[1])

有趣的是,如果你分组A[1:nrow(A), ]而不是A它,虽然它是相同的数据。

编辑 2: 我现在可以运行几次计算,但在某些时候,我总是会遇到相同计算的致命错误。我觉得这似乎是我的系统特有的。所以可能我必须重新安装所有东西。

编辑3:as.numeric(score)解决了这个问题。因此,分数的名称属性似乎有些问题。但是,它们看起来并不可疑,并且都具有相同的名称,即“new_confirmed10”。

标签: rdplyr

解决方案


这是实现 R 函数的 C 代码中的内部错误。它不应该出现在用户代码中。这绝对是某个地方的错误。traceback()您可能可以通过在看到它后立即运行来稍微缩小位置。这将列出在错误发生时所有处于活动状态的 R 函数,并可能给出调用错误 C 代码的 R 函数的位置。

请把一个可重现的例子放在一起(即给我们一种构建方法,dat以便我们可以在我们的系统上重现它)。SO 上的某个人将能够找到错误的原因,也许能够告诉你一个解决方法,或者告诉代码的作者如何修复它。

如果您不能这样做,那么任何人都不太可能帮助您,但这里有一些一般性建议:

  • 不要使用仅在 Github 上的包或包版本,坚持使用通常经过更好测试的 CRAN 包。
  • 如果您正在开发自己的 C/C++ 代码并且它以某种方式在这里涉及,您需要使用gdblldb进行 C 级调试。如果您以前没有使用过这些,那并不容易。

编辑添加:

在检查了dat.rds文件的上传版本后,我想我已经发现了部分问题。运行此代码:

dat <- readRDS("dat.rds")
table(names(dat$score))

我可以看到 的名称dat$score是 744 个副本"new_confirmed10"。重复的名字是不寻常的,但合法的。但是, 的长度dat$score是 1488 (与 的行数相同dat),据我所知,名称的数量与对象的长度不同是不合法的。(如果您只为某些元素分配名称,则应该NA在其他元素上获得名称。)

当您运行代码时,mutate 调用中的某些内容会崩溃,因为它假定对象格式正确,但事实并非如此。所以这不是 中的错误dplyr,但我认为这是创建对象的任何代码中的错误dat.rds。你有任何关于它是如何创建的记录吗?


推荐阅读