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

У меня есть список предметов и количество раз, когда они были куплены. Большинство из этих предметов являются частью нескольких категорий. Некоторые относятся к одной категории, другие — к двум, некоторые — к более чем двум.

Теперь я хотел бы составить рейтинг по каждой категории, показывающий наиболее конвертированные элементы, независимо от того, присутствует ли один элемент в нескольких категориях. Это прекрасно.

Категории в одной строке разделены строкой >.

ItemId           Category                        PCC
5063660193       Go to Gifts                     2
24154563660193   Go to Gifts>All Gifts        1

Я хотел бы, чтобы это стало:

ItemId          Category      PCC
5063660193      Go to Gifts   2
24154563660193  Go to Gifts   1
24154563660193  All Gifts     1

Тогда останется только ранжировать их с помощью функции rank() over() в SQL. Если это невозможно в SQL, я могу использовать R. Возможно, в этом случае может пригодиться функция reshape.


person Gianluca    schedule 01.04.2014    source источник


Ответы (2)


Вот решение с использованием R-

# Your data
df <- read.table(text="ItemId           Category                        PCC
             5063660193       'Go to Gifts'                     2
             24154563660193   'Go to Gifts&gt;All Gifts'        1",
            header=T, stringsAsFactors=FALSE)


# Split Category at each "&gt;"
s <- strsplit(df$Category , "&gt;")


# Get length of each split string :length 1 if there was no "&gt;" 
l <- lapply(s , length)

# Repeat the rows where there are "&gt;"
new.df <- df[ rep(1:nrow(df) , l) , ]

# Split Category into its the compnients seperated by "&gt;"
new.df$Category <- unlist(s)
person user20650    schedule 01.04.2014
comment
Единственное изменение, которое мне нужно было сделать, чтобы заставить его работать, — это использовать функцию as.character в strsplit: strsplit(as.character(df$Category), ) - person Gianluca; 02.04.2014
comment
@Джанлука; Да Категория должна быть символьной переменной (а не фактором) в вашем наборе данных. - person user20650; 02.04.2014

Вот несколько более простой способ использования таблиц данных.

library(data.table)
dt <- data.table(df)
result <- dt[,strsplit(as.character(Category),"&gt;"),by=list(ItemId,PCC)]
setnames(result,"V1","Category")
result
#            ItemId                    PCC           Category
# 1:     5063660193                      2        Go to Gifts
# 2: 24154563660193                      1        Go to Gifts
# 3: 24154563660193                      1          All Gifts
person jlhoward    schedule 01.04.2014
comment
Привет, Говард! к сожалению, я получил это сообщение об ошибке: › результат ‹- dt[, strsplit(as.character(Category), ), by = list(ItemId, PCC)] Error in [.data.table(dt, , strsplit(as.character(Category), ), : j не оценивает одинаковое количество столбцов для каждой группы - person Gianluca; 02.04.2014
comment
@Джанлука; Есть ли дубликаты идентификаторов в непреобразованных данных? - person user20650; 03.04.2014
comment
Я должен был бы увидеть фактический набор данных. Можешь загрузить и скинуть ссылку? Это работает на вашем образце - person jlhoward; 03.04.2014