我正在尝试从下面的数据框构建数据透视表。 “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来完成任务,但我相信只有当你给它一个聚合函数时它才有用。我可能错了。提前感谢能够提供帮助的任何人。
答案 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