简体   繁体   English

为什么 `pivot_wider` 不能在 `data.table` 上工作

[英]Why doesn't `pivot_wider` work on a `data.table`

A simple example of long to wide pivot:长到宽 pivot 的简单示例:

library(tidyverse)
library(data.table)

df <- data.frame(names=letters[1:3],values=1:3)
df %>% pivot_wider(names_from=names,values_from=values)
#works

dt <- data.table(names=letters[1:3],values=1:3)
dt %>% pivot_wider(names_from=names,values_from=values)
Error in data.frame(row = row_id, col = col_id) : 
  arguments imply differing number of rows: 0, 3

Why does this error happen?为什么会发生此错误?

PS: one fix is to remove the data tableness with as.data.frame(dt) . PS:一种解决方法是使用as.data.frame(dt)删除数据表。

dt %>% as.data.frame %>% pivot_wider(names_from=names,values_from=values)
#works

Manual entry of this function in tidyr mentions only "data frame" without specifying other classes like tibble or data.table.tidyr中手动输入此 function 仅提及“数据框”,而未指定其他类,如 tibble 或 data.table。 So addressing your question, function is either not designed to handle data.table, or there is a bug in pivot_wider .因此,解决您的问题,function 不是设计用于处理 data.table,或者在pivot_wider中存在错误。

As a workaround you can now use as.data.frame (as you already mentioned), if your data is big then possibly setDF to avoid extra in-memory copy.作为一种解决方法,您现在可以使用as.data.frame (正如您已经提到的),如果您的数据很大,那么可能setDF以避免额外的内存复制。

You can also use data.table function dcast to perform same kind of transformation.您还可以使用data.table function dcast执行相同类型的转换。

library(tidyr)
library(data.table)

df <- data.frame(names=letters[1:3],values=1:3)
pivot_wider(df, names_from=names,values_from=values)
## A tibble: 1 x 3
#      a     b     c
#  <int> <int> <int>
#1     1     2     3
setDT(df)
dcast(df, .~names, value.var="values")[, ".":=NULL][]
#   a b c
#1: 1 2 3

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM