群集计算教程 - 传播问题

时间:2017-04-17 15:21:54

标签: r spread

在关注这个非常有趣的教程(https://rpubs.com/hrbrmstr/customer-segmentation-r)时,我遇到了一个我真不理解的错误。

以下是导致消息“错误:值列”' n'在输入中不存在。'在Rstudio 1.0.136中:

library(readxl)
library(dplyr)
library(tidyr)
library(viridis)
library(ggplot2)
library(ggfortify)

url <- "http://blog.yhathq.com/static/misc/data/WineKMC.xlsx"
fil <- basename(url)
if (!file.exists(fil)) download.file(url, fil)

offers <- read_excel(fil, sheet = 1)
colnames(offers) <- c("offer_id", "campaign", "varietal", "min_qty", "discount", "origin", "past_peak")
head(offers, 12)

transactions <- read_excel(fil, sheet = 2)
colnames(transactions) <- c("customer_name", "offer_id")
transactions$n <- 1
head(transactions)

left_join(offers, transactions, by="offer_id") %>% 
  count(customer_name, offer_id, wt=n) %>%
  spread(offer_id, n) %>%
  mutate_each(funs(ifelse(is.na(.), 0, .))) -> dat

最后一行是创建问题的那一行。

任何人都知道为什么?

1 个答案:

答案 0 :(得分:0)

请查看?dplyr::count的手册页:

  

请注意

     

返回数据中的列名通常为n,即使您有   提供了一个重量。

     

如果数据已经有一个名为n的列,则为输出列   将被称为 nn 。如果表已经有名为n和nn的列   然后返回的列将是nnn,依此类推。

在这种情况下,原始数据已经有一个名为n的列,因此count之后的新列将被称为nn。因此,您必须将spread(offer_id, n) %>%更改为spread(offer_id, nn) %>%。可能会在此更改之前编写该教程。