首页 > 解决方案 > 尝试加入 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 的任何功能。

标签: rdplyr

解决方案


您的错误是引用了一些tbl_df具有Date类但包含字符数据的未指定变量 - 这可能是但不一定是命名的变量Date(这似乎是您解释错误的方式,这是对错误)。

这个错误是由date_validate()新版本vctrs包中的一个内部函数引发的,它是dplyrand的依赖项tbl_dfvctrs与基本 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对象。生成的对象打印起来就好像它是一个普通对象,但它仍然是一个字符向量。:DatecharacternumericDateDate


> 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动词和扩展连接,请注意这一点。它们通过跳过许多操作的隐式转换来获得更好的性能。但作为权衡,他们必须对对象类型更加挑剔。


推荐阅读