Создание нового уникального набора данных из дат и категорий в R - PullRequest
0 голосов
/ 02 мая 2018

Я новичок в R и могу использовать любую помощь, какую только могу! У меня есть dataframe, который имеет OrderDate и MajorCategory в качестве двух переменных. Даты заказов варьируются от 2005-01-01 до 2007-12-31, а MajorCategory - от 1 до 73 с 35,5 миллионами записей. Каждый OrderDate ссылается на определенный заказ, который имеет идентификационный номер, а также относится к определенной категории MajorCate. Я пытаюсь создать фрейм данных, чтобы показать каждую уникальную OrderDate и количество каждой MajorCategory, которая была заказана в эту дату.

Набор данных в настоящее время выглядит примерно так:

OrderDate   MajorCategory
2005-12-12  66
2005-12-12  66
2006-03-28  43
2006-05-16  66

Я разделил уникальную OrderDate (после изменения класса на Date) на свой собственный фрейм данных с помощью:

OD <- as.data.frame(unique(DMEFLines3Dataset2$OrderDate))
OD <- as.data.frame(sort(OD$`unique(DMEFLines3Dataset2$OrderDate)`))

Я не уверен, как заставить MajorCategory показывать мне счет за каждую дату. Таким образом, желаемый результат будет выглядеть примерно так:

OD          MC_1    MC_2
2005-01-01  4       6
2005-01-02  7       45
2005-01-03  3       23

где OD - Дата заказа, а MC_X - количество заказов MajorCategory на дату (от MC_1 до MC_73).

Я пытался использовать для циклов, частоты и количества, но я не могу понять это. Любая помощь будет очень ценится:)

Ответы [ 3 ]

0 голосов
/ 03 мая 2018

Как я понимаю, вы хотите что-то вроде этого:

    OrderDate<- as.Date(c('2005-12-12','2005-12-12','2006-03-28','2006-05-16','2005-03-04','2005-12-12'))
    MajorCategory<- as.numeric(c(66, 66, 43, 66, 43, 1))
    OD=data.frame(OrderDate,MajorCategory)

    out <- split(OD, OD$MajorCategory)
    count=lapply(out, function(x) aggregate(x$MajorCategory, FUN = length, by = list(x$OrderDate)))
0 голосов
/ 03 мая 2018

Надеюсь, это поможет!

library(tidyverse)

df1 <- df %>%
  group_by(OrderDate, MajorCategory) %>%
  tally() %>%
  mutate(MajorCategory = paste("MC", MajorCategory, sep="_")) %>%
  spread(MajorCategory, n)
df1

Вывод:

  OrderDate  MC_43 MC_66 MC_67
1 2005-12-12    NA     2     1
2 2006-03-28     1    NA    NA
3 2006-05-16    NA     1    NA

Пример данных:

df <- structure(list(OrderDate = c("2005-12-12", "2005-12-12", "2005-12-12", 
"2006-03-28", "2006-05-16"), MajorCategory = c(66L, 66L, 67L, 
43L, 66L)), .Names = c("OrderDate", "MajorCategory"), class = "data.frame", row.names = c(NA, 
-5L))
0 голосов
/ 02 мая 2018

Я не эксперт по R, и если бы у меня была возможность, я бы попытался агрегировать данные по мере необходимости на другом языке, а затем загрузить агрегированные данные во фрейм данных R для дальнейшего анализа.

Я сделал что-то близкое к тому, что вы просите, рассчитав ROC-графики из выходных данных сторонней модели наивного байесовского алгоритма, которая состояла из сведений о назначениях, сгруппированных по отделам. Немного доработав свой код, я смог получить фрейм данных с количеством идентификаторов, сгруппированных по дате, который, похоже, структурирован так, как вы просите.

    library(RODBC)

dbConnection <- 'Driver={SQL Server};Server=SERVERNAME;Database=DBName;Trusted_Connection=yes'
channel <- odbcDriverConnect(dbConnection)

InputDataSet <- sqlQuery(channel, "
SELECT OrderID, OrderDate, MajorCategory from [dbo].[myDataSet];"
)

results <- data.frame("date", "ordCount")
names(results) <- c("date", "ordCount")
for (dt in unique(InputDataSet$OrderDate)) {
    ordCount <- 0
    filteredSet = InputDataSet[InputDataSet$OrderDate == dt,]
    for (mc in unique(filteredSet$MajorCategory)) {
        ordCount <- ordCount+1
    }

    df <- data.frame(dt, ordCount)
    names(df) <- c("date", "ordCount")
    results <- rbind(df, results)
}


results
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...