Моя команда и я имеем дело со многими тысячами URL-адресов, имеющих похожие сегменты.Некоторые URL имеют один сегмент («seg», множественное число, «segs») в интересующей нас позиции.Другие похожие URL имеют другой сегмент в интересующей нас позиции.Нам нужно отсортировать фрейм данных, состоящий из URL-адресов и связанных уникальных сегментов, в позиции интереса, показывая частоту этих уникальных сегментов.
Вот упрощенный пример:
url <- c(1, 3, 1, 4, 2, 3, 1, 3, 3, 3, 3, 2)
seg <- c("a", "c", "a", "d", "b", "c", "a", "x", "x", "y", "c", "b")
df <- data.frame(url,seg)
Мыищу следующее:
url freq seg
1 3 a in other words, url #1 appears three times each with a seg = "a",
2 2 b in other words: url #2 appears twice each with a seg = "b",
3 3 c in other words: url #3 appears three times with a seg = "c",
3 2 x two times with a seg = "x", and,
3 1 y once with a seg = "y"
4 1 d etc.
Я могу добраться туда, используя цикл и несколько небольших шагов, но я убежден, что есть более элегантный способ сделать это.Вот мой неуместный подход:
Создание пустого фрейма данных со строками num.unique и тремя столбцами (url, freq, seg)
result <- data.frame(url=0, Freq=0, seg=0)
Определение уникальных URL-адресов
unique.df.url <- unique(df$url)
Цикл по фрейму данных
for (xx in unique.df.url) {
url.seg <- df[which(df$url == unique.df.url[xx]), ] # create a dataframe for each of the unique urls and associated segs
freq.df.url <- data.frame(table(url.seg)) # summarize the frequency distribution of the segs by url
result <- rbind(result,freq.df.url) # append a new data.frame onto the last one
}
Исключение строк в фрейме данных, где частота = 0
result.freq <- result[which(result$Freq |0), ]
Сортировка фрейма данных по URL
result.order <- result.freq[order(result.freq$url), ]
Это дает желаемыйрезультаты, но, поскольку это настолько не элегантно, я обеспокоен тем, что, как только мы перейдем к масштабу, требуемое время будет чрезмерным или, по крайней мере, проблемой.Какие-либо предложения?