【发布时间】:2020-07-20 19:31:25
【问题描述】:
我有一个大型数据集,我正在尝试使用 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 = "-"
)
但这给出了错误:
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 = "-"
)
错误信息是:
错误:无法对不存在的元素进行子集化。
x 位置 1 和 2 不存在。
i 只有 0 个元素。
运行rlang::last_error()以查看错误发生的位置。
另外:警告信息:
预计2件。在 7 行 [1, 2, 3, 4, 5, 6, 7] 中填充了NA的缺失部分。rlang::last_error()
错误:内部错误:跟踪数据不是正方形。
更新 - 它现在给出这个错误信息:
UseMethod("pivot_longer") 中的错误: 没有适用于“c('dtplyr_step_first', 'dtplyr_step')”类对象的“pivot_longer”方法
顺便说一句,这也有效,但我认为它失去了 dtplyr 的性能提升:
my_data_dt %>%
as_tibble() %>%
pivot_longer(
cols = everything(),
names_to = c(".value", "grid_square"),
names_sep = "-"
)
【问题讨论】:
-
只是一个想法:
pivot_longer是tidyr动词,而不是dplyr动词,这可以解释为什么它没有被翻译。 -
谢谢,太好了。为了完整起见,我有:
#meltmy_data_dt <- my_data_dt %>%as.data.table() %>%melt.data.table(measure = patterns("^date-", "^value-"), value.name = c("date", "value"))# Fix variable names (conveniently I already have a list of variable names from an# earlier step in my scriptv_names <- c("A", "B")my_data_dt$variable <- v_names[my_data_dt$variable] -
你也可以看看:github.com/markfairbanks/tidytable 和 github.com/TysonStanley/tidyfast(我自己没有测试过),他们试图缩小 tidyr - data.table 的差距
-
pivot_longer()现在包含在dtplyr的开发版本中,可以使用devtools::install_github("tidyverse/dtplyr")进行安装。这应该在v1.2.0 is released 时起作用(我还没有在这个问题上测试过开发版本)。
标签: r dplyr data.table dtplyr