如何根据当前模式预测连续的下一个变量?

时间:2015-07-27 20:05:30

标签: r

我有一个数据框,其中包含某位所有者按时间顺序购买的宠物。我想通过确定一种宠物跟随另一种宠物的频率来预测一个主人可能购买的宠物(例如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"))

基本上,我想要一张一张宠物导致另一只宠物多少次的计数表,即:

  • 狗 - 鱼(1)
  • 狗 - 猫(1)
  • 狗 - 狗(3)

2 个答案:

答案 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