在R中重塑数据帧但不使用聚合函数

时间:2016-02-24 23:42:41

标签: r reshape

我正在尝试从下面的数据框构建数据透视表。 “VisitID”是访问网站的用户的唯一ID,“PageName”是他们访问过的网页,“订单”是他们访问过的页面的序列。例如,此数据框的第一行表示“用户001访问过主页,这是他/她访问的第一页”。

    VisitID            PageName             Order
      001              Homepage               1
      001              ContactUs              2
      001              News                   3
      002              Homepage               1
      002              Careers                2
      002              News                   3

所需的输出应将“VisitID”转换为行,将“Order”转换为列,并使用“PageName”填充表格

                 1           2          3
      001     Homepage    ContactUs    News                                             
      002     Homepage    Careers      News      

我曾考虑使用reshape :: cast来完成任务,但我相信只有当你给它一个聚合函数时它才有用。我可能错了。提前感谢能够提供帮助的任何人。

1 个答案:

答案 0 :(得分:0)

您不需要聚合。只要在强制转换公式中每个列组合只有一行,您就会在输出中插入value.var的值。

library(reshape2)

dcast(mydata, VisitID ~ Order, value.var="PageName")

以下是一个例子:

# Fake data
dat = data.frame(group1=rep(LETTERS[c(1,1:3)],each=2), group2=rep(letters[c(1,1:3)]),
                 values=1:8)
dat
  group1 group2 values
1      A      a      1
2      A      a      2
3      A      b      3
4      A      c      4
5      B      a      5
6      B      a      6
7      C      b      7
8      C      c      8

请注意,第1行和第2行的group列的值与第5行和第6行的值相同。因此,dcast通过计算每个单元格中的值的数量进行聚合。 / p>

dcast(dat, group1 ~ group2, value.var="values")
Aggregation function missing: defaulting to length
  group1 a b c
1      A 2 1 1
2      B 2 0 0
3      C 0 1 1

现在让我们删除第1行和第5行,以摆脱重复的group组合。由于现在每个单元格只有一个值,dcast会返回实际值,而不是值的数量。

dcast(dat[-c(1,5),], group1 ~ group2, value.var="values")
  group1  a  b  c
1      A  2  3  4
2      B  6 NA NA
3      C NA  7  8