前段时间我提出了一个关于创建市场篮子数据的问题。现在我想创建一个类似的data.frame,但是基于第三个变量。不幸的是我遇到了问题。上一个问题:Effecient way to create market basket matrix in R
@shadow和@ SimonO101给了我很好的答案,但我无法正确改变他们的anwser。我有以下数据:
Customer <- as.factor(c(1000001,1000001,1000001,1000001,1000001,1000001,1000002,1000002,1000002,1000003,1000003,1000003))
Product <- as.factor(c(100001,100001,100001,100004,100004,100002,100003,100003,100003,100002,100003,100008))
input <- data.frame(Customer,Product)
我现在可以通过以下方式创建列联表:
input_df <- as.data.frame.matrix(table(input))
但是我有一个第三个(数字)变量,我想在表中输出。
Number <- c(3,1,-4,1,1,1,1,1,1,1,1,1)
input <- data.frame(Customer,Product,Number)
现在代码(当然,现在有3个变量)不再起作用了。我正在寻找的结果具有唯一的Customer作为行名称和唯一的Product作为列名称。并且Number为值(如果不存在则为0),此数字可以通过以下方式计算:
input_agg <- aggregate( Number ~ Customer + Product, data = input, sum)
希望我的问题很明确,如果不清楚,请发表评论。
答案 0 :(得分:6)
您可以使用xtabs
:
R> xtabs(Number~Customer+Product, data=input)
Product
Customer 100001 100002 100003 100004 100008
1000001 0 1 0 2 0
1000002 0 0 3 0 0
1000003 0 1 1 0 1
答案 1 :(得分:4)
此类问题专为reshape2::dcast
...
require( reshape2 )
# Too many rows so change to a data.table.
dcast( input , Customer ~ Product , fun = sum , value.var = "Number" )
# Customer 100001 100002 100003 100004 100008
#1 1000001 0 1 0 2 0
#2 1000002 0 0 3 0 0
#3 1000003 0 1 1 0 1
最近,dcast
与data.table
对象一起使用的方法是由@Arun响应FR #2627实现的。好东西。您必须使用开发版1.8.11。此刻,它应该用作dcast.data.table
。这是因为dcast
在reshape2
包中尚未成为S3通用。也就是说,你可以这样做:
require(reshape2)
require(data.table)
input <- data.table(input)
dcast.data.table(input , Customer ~ Product , fun = sum , value.var = "Number")
# Customer 100001 100002 100003 100004 100008
# 1: 1000001 0 1 0 2 0
# 2: 1000002 0 0 3 0 0
# 3: 1000003 0 1 1 0 1
这应该可以更好地处理更大的数据,并且应该比reshape2:::dcast
快得多。
或者,您可以试用可能会或可能不会崩溃的reshape:::cast
版本......试试!!
require(reshape)
input <- data.table( input )
cast( input , Customer ~ Product , fun = sum , value = .(Number) )