r - 尝试加入 dplyr 时出现损坏警告
问题描述
寻找一些我以前从未见过的错误的帮助,似乎在这里找不到任何帮助。
我正在尝试加入两个数据集,然后保留不重复的条目。但是,当我运行下面的代码时:
alllawsuits <- allfjccases %>%
inner_join(.,allprisonsnos) %>%
distinct(CASENAME,PLT,DEF,FILEDATE,TERMDATE,NOSedit,Docket,completename,.keep_all=T)
我收到以下错误:
Joining, by = c("Docket", "NOSedit", "File.Year", "File.Month", "File.Day")
Error: Internal error in ``date_validate()``: Corrupt ``Date`` with unknown type character.
该Date
变量不是合并变量之一,即使我将其从两个数据框中排除,代码仍然无法运行。两个数据集中的所有列类型都是相同的,我完全不知道如何解决这个问题。想法?
其他几件事:过去的代码运行良好并且merge
工作正常,只是没有join
来自 dplyr 的任何功能。
解决方案
您的错误是引用了一些tbl_df
具有Date
类但包含字符数据的未指定变量 - 这可能是但不一定是命名的变量Date
(这似乎是您解释错误的方式,这是对错误)。
这个错误是由date_validate()
新版本vctrs
包中的一个内部函数引发的,它是dplyr
and的依赖项tbl_df
。vctrs
与基本 R 中的大多数操作相比,对有效对象的构成更加挑剔。类变量Date
是否是连接键的一部分并不重要,因为在连接创建新对象Date
时会执行列验证。tbl_df
通常,Date
对象是具有属性的数值向量class = "Date"
。出于某种原因,有一种特殊的 S3 方法专门用于防止Date
对象返回,例如is.numeric(my_date_object) = TRUE
(查看定义base::is.numeric.Date()
- 此方法取代了对 Date 对象的原始is.numeric
函数的分派),但它们通常是“幕后”的数值,可以这么说. 如果我们去掉类属性,我们可以验证这一点。
> test <- as.Date(c("2020-01-01", "2020-01-02"))
> test
[1] "2020-01-01" "2020-01-02"
> str(test)
Date[1:2], format: "2020-01-01" "2020-01-02"
> is.character(test)
[1] FALSE
> is.numeric(test)
[1] FALSE
> is.numeric(unclass(test))
[1] TRUE
但是,也可以通过将类显式分配给所有单个元素都可以强制转换为的向量来创建Date
对象。生成的对象打印起来就好像它是一个普通对象,但它仍然是一个字符向量。:Date
character
numeric
Date
Date
> test <- structure(c("21424", "21425"), class = "Date")
> test
[1] "2028-08-28" "2028-08-29"
> str(test)
Date[1:2], format: "2028-08-28" "2028-08-29"
> is.character(test)
TRUE
> is.numeric(test)
FALSE
> is.numeric(unclass(test))
[1] FALSE
> tibble(a = test)
Error: Internal error in `date_validate()`: Corrupt `Date` with unknown type character.
还有你的错误。在您显示的代码的上游某处,您执行了一些创建非标准Date
列的操作。要么不这样做,要么用类似的东西将违规列强制到正常日期
blah blah blah... %>%
mutate(my_column = as.Date(as.numeric(my_column), origin = "1970-01-01")) %>%
left_join(blah blah ...
许多基本 R 方法并不关心这一点,因为它们在将任何内容传递给编译函数之前执行隐式转换。vctrs
,以及dplyr
动词和扩展连接,请注意这一点。它们通过跳过许多操作的隐式转换来获得更好的性能。但作为权衡,他们必须对对象类型更加挑剔。
推荐阅读
- java - GAE 为任务队列数据存储调用获取大量 CancellationException
- sql - 快照数据库是否具有与 SQL 中的源数据库相同的即时记录?
- heroku - 有没有办法使用 --bigkeys 之类的选项运行 heroku redis-cli?
- json - 如何从 aws ec2 describe-instances 获取公共 dns 名称
- javascript - 用于匹配经纬度对列表的正则表达式
- javascript - Express.js 的路径 url 有问题,包括“?”
- python - 在没有在系统中安装 python 的情况下在 IDE 中运行 Python 代码
- javascript - 类型错误:尝试 .filter() 时“无法读取未定义的属性 'toLowerCase'”
- javascript - 使用轮子事件循环遍历数组
- java - 如何仅使用一行扫描仪输入将 int 数组中的所有元素求和