我有一个数据框,其中包含某位所有者按时间顺序购买的宠物。我想通过确定一种宠物跟随另一种宠物的频率来预测一个主人可能购买的宠物(例如Buys Dog,然后购买Cat)。如何识别每个排列的计数?
df <- data.frame(
id = c("AZ001", "AZ002", "AZ003", "AZ004", "AZ005"),
p1 = c("Dog", "Cat", "Fish", "Dog", "Cat"),
p2 = c("Dog", "Fish", "Dog", "Cat", "Cat"),
p3 = c("Fish", "Cat", "Dog", "Fish", "Fish"),
p4 = c(NA, "Cat", NA, "Fish", "Dog"),
p5 = c(NA, NA, NA, "Cat", "Dog"))
基本上,我想要一张一张宠物导致另一只宠物多少次的计数表,即:
答案 0 :(得分:5)
首先,转换为角色:
df[] <- lapply(df,as.character)
然后,我们可以通过以长格式存储来摆脱NA:
library(data.table)
library(reshape2) # not needed with data.table 1.9.5+
dflong <- setDT(na.omit(melt(df, id.var="id")))
最后,使用data.table语法,我们可以(1)构造对和(2)制表:
dflong[,
paste(head(value,-1), tail(value,-1), sep="_")
,by=id][,
table(V1)
]
由paste
构造的新变量被赋予默认名称V1
。结果是:
V1
Cat_Cat Cat_Fish Dog_Cat Dog_Dog Dog_Fish Fish_Cat Fish_Dog Fish_Fish
2 3 1 3 1 2 2 1
答案 1 :(得分:4)
我认为一个合理的策略是对列对进行迭代并创建一个可以通过table()
汇总的交互。例如
animal.cols <- 2:6
as.data.frame(table(unlist(lapply(seq_along(head(animal.cols,-1)), function(i) {
y<-df[,c(animal.cols[i], animal.cols[i+1])];
interaction(y[[1]],y[[2]])
}))))
返回
Var1 Freq
1 Cat.Cat 2
2 Dog.Cat 1
3 Fish.Cat 2
4 Cat.Dog 0
5 Dog.Dog 3
6 Fish.Dog 2
7 Cat.Fish 3
8 Dog.Fish 1
9 Fish.Fish 1