如何将 rpivotTable 结果转换为数据框

How to convert rpivotTable result in to dataframe

如何将 rpivotTable 结果转换为数据帧。 我想用 rpivotTable 的结果创建新的 datafrmae,

可以用 R 做吗?

数据集喜欢

User     Order_Bin
a          PPL
b          CCD
c          CCD
d          OLP
a          OLP
c          PPL
b          OLP
a          PPL
a          OLP
b          PPL
c          CCD
d          CCD
d          OLP
c          OLP
b          OLP
b          CCD

如何得到下面代码的结果 data.frame

library(rpivotTable)
rpivotTable(
  inventory,
  aggregatorName = "Count",
  cols = "Order_Bin",
  rows = "User",
  rendererName = "Heatmap",
  width = "100%",
  height = "1000px")

根据 rpivotTable 的文档,没有导出工具。

所以,你必须自己聚合。一种可能是

reshape2::dcast(inventory, User ~ Order_Bin, length, margins = TRUE)

哪个returns

   User CCD OLP PPL (all)
1     a   0   2   2     4
2     b   2   2   1     5
3     c   2   1   1     4
4     d   1   2   0     3
5 (all)   5   7   4    16

为了比较,这里是 pivotTable() 调用的输出:

请记下总计行和列。

数据框连同行和列变量名称以及聚合器名称一起存储在列表中。

library(rpivotTable)
pv <- rpivotTable(
  df,
  aggregatorName = "Count",
  cols = "Order_Bin",
  rows = "User",
  rendererName = "Heatmap",
  width = "100%",
  height = "1000px")

class(pv)
str(pv)
List of 8
 $ x            :List of 4
  ..$ data     :'data.frame':   16 obs. of  2 variables:
  .. ..$ User     : chr [1:16] "a" "b" "c" "d" ...
  .. ..$ Order_Bin: chr [1:16] "PPL" "CCD" "CCD" "OLP" ...
  ..$ params   :List of 4
  .. ..$ rows          :List of 1
  .. .. ..$ : chr "User"
  .. ..$ cols          :List of 1
  .. .. ..$ : chr "Order_Bin"
  .. ..$ aggregatorName:List of 1
  .. .. ..$ : chr "Count"  # etc. ...

此信息随后可用于创建您要求包含数据透视表的结果数据框

pv$x$data %>%
  group_by(Order_Bin, User) %>%
  count() %>% 
  pivot_wider(id_cols=User, names_from=Order_Bin, values_from=n, 
              values_fill=list(n=0))

# A tibble: 4 x 4
  User    CCD   OLP   PPL
  <chr> <int> <int> <int>
1 b         2     2     1
2 c         2     1     1
3 d         1     2     0
4 a         0     2     2

编辑: 要获取行百分比:

pv$x$data %>%
  group_by(Order_Bin, User) %>%
  count() %>% 
  group_by(User) %>%
  mutate(n=n/sum(n)) %>%
  pivot_wider(id_cols=User, names_from=Order_Bin, values_from=n, 
              values_fill=list(n=0))

# A tibble: 4 x 4
# Groups:   User [4]
  User    CCD   OLP   PPL
  <chr> <dbl> <dbl> <dbl>
1 b     0.4   0.4    0.2 
2 c     0.5   0.25   0.25
3 d     0.333 0.667  0   
4 a     0     0.5    0.5