为什么`pivot_wider`不适用于`data.table`

长到宽枢轴的简单示例:

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

为什么会发生这个错误?

PS:一种解决方法是使用as.data.frame(dt).

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

回答

此函数的手动输入tidyr 仅提及“数据框”,而未指定其他类,如 tibble 或 data.table。因此,解决您的问题,函数不是设计用于处理 data.table,或者pivot_wider.

作为一种解决方法,您现在可以使用as.data.frame(正如您已经提到的),如果您的数据很大,那么可能setDF会避免额外的内存中复制。

您还可以使用data.table函数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

  • I think this is some specific case. `pivot_wider` works with `data.table`. `df <- mtcars;
    setDT(df); tidyr::pivot_wider(df, names_from = cyl, values_from = mpg)` returns the same output as `tidyr::pivot_wider(mtcars, names_from = cyl, values_from = mpg)`

以上是为什么`pivot_wider`不适用于`data.table`的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>