【问题标题】:How to predict the next variable in a row based on current patterns?如何根据当前模式预测连续的下一个变量?
【发布时间】:2015-07-27 20:05:30
【问题描述】:

我有一个数据框,其中包含某个所有者按时间顺序购买的宠物。我想通过确定一种宠物跟随另一种宠物的频率来预测主人接下来可能购买哪种宠物(例如,购买狗,然后购买猫)。如何识别每个排列的计数?

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)

【问题讨论】:

  • @MrFlick 我认为这是长度为 2 的序列列表(第一行是 Dog+Dog,然后是 Dog+Fish),但不确定。
  • @MrFlick 在编辑中添加所需的输出。

标签: r


【解决方案1】:

首先,转换为字符:

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 

【讨论】:

    【解决方案2】:

    我认为一个合理的策略是迭代列对并创建可以通过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
    

    【讨论】:

      猜你喜欢
      • 2015-03-27
      • 2019-09-02
      • 2018-05-17
      • 1970-01-01
      • 2016-10-03
      • 2021-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多