使用 dtplyr 时,pivot_longer 给出错误

s_p*_*ike 5 r dplyr data.table dtplyr

我有一个大型数据集,正在尝试使用 dtplyr 进行整理。它由不同位置的大量 (>1000) 日期值对组成。原始版本使用了pivot_longer,它在dplyr中工作正常,但在dtplyr中给出错误。有没有办法解决这个问题,保持 dtplyr 的性能优势?

这有效

library(tidyverse)
library(dtplyr)
library(data.table)

my_data_tb <- tribble(
  ~`date-A`, ~`value-A`, ~`date-B`, ~`value-B`,
  "date1", 1, "date2", 2,
  "date2", 1, "date3", 2 
)

my_data_tb %>% 
  pivot_longer(
  cols = everything(),
  names_to = c(".value", "grid_square"),
  names_sep = "-"
)
Run Code Online (Sandbox Code Playgroud)

但这给出了错误:

my_data_dt <- as.data.table(my_data_tb)
my_data_dt <- lazy_dt(my_data_dt)

my_data_dt %>%
  pivot_longer(
    cols = everything(),
    names_to = c(".value", "grid_square"),
    names_sep = "-"
  )
Run Code Online (Sandbox Code Playgroud)

错误信息是:

错误:无法对不存在的元素进行子集化。
x 位置 1 和 2 不存在。
i 只有 0 个元素。
运行rlang::last_error()看看哪里出错了。
另外:警告消息:
预计 2 件。缺失的部分填充NA为 7 行 [1, 2, 3, 4, 5, 6, 7]。
rlang::last_error()
错误:内部错误:迹线数据不是方形的。

更新 - 它现在给出以下错误消息:

UseMethod("pivot_longer") 中的错误:没有适用于 'pivot_longer' 的方法应用于类“c('dtplyr_step_first', 'dtplyr_step')”的对象

顺便说一句,这也有效,但我认为它失去了 dtplyr 性能增益:

my_data_dt %>%
  as_tibble() %>%
  pivot_longer(
    cols = everything(),
    names_to = c(".value", "grid_square"),
    names_sep = "-"
  )
Run Code Online (Sandbox Code Playgroud)

s_p*_*ike 2

Dtplyr 版本 1.2.0 现已在 CRAN 上可用,这意味着该问题现已解决!

对于遇到此错误的任何人,请检查/更新您的 dtplyr 版本,以确保您正在运行 >=1.2.0:

install.packages("dtplyr")
Run Code Online (Sandbox Code Playgroud)

(注意。这不会作为 tidyverse 包的一部分进行更新,因此请确保单独进行)

https://www.tidyverse.org/blog/2021/12/dtplyr-1-2-0/

https://cran.r-project.org/web/packages/dtplyr/index.html