2015-08-24 3 views
1

У меня есть большой data.frame, содержащий эти значения:частоты Count и добавьте общую сумму

ID_Path Conversion Lead Path Week 
32342  A25177  1  JEFD 2015-25 
32528  A25177  1  EUFD 2015-25 
25485  A3   1  DTFE 2015-25 
32528  Null   0  DDFE 2015-25 
23452  A25177  1  JDDD 2015-26 
54454  A25177  1  FDFF 2015-27 
56848  A2323   1  HDG  2015-27 

я хочу, чтобы иметь возможность создать таблицу частот, которая отображает таблицу, как это:

Week  Total A25177 A3 A2323 
2015-25 3  2   1  0 
2015-26 1  1   0  0 
2015-27 2  1   0  1 

В каждом уникальном Conversion есть столбец, и все время, когда Conversion является Null, совпадает с Lead. В этом примере есть 3 уникальных преобразования, иногда их 1, иногда их 5 или Больше. Так не должно быть ограничено только 3.

Я создал новый DF, содержащий только Conversion, которые не Null Я попытался с помощью data.table с этим кодом:

DF[,list(Week=Week,by=Conversion] 

не повезло.

Я попытался с помощью plyr с этим кодом:

ddply(DF,~Conversion,summarise,week=week) 

не повезло.

+0

Откуда взялось 'A2323' и почему' Total' составляет 5 для этой строки? Мне кажется, что все, что вам нужно, это нечто вроде 'addmargins (таблица (DF [c (« Неделя »,« Конверсия »)]), 2)' –

+0

Или может быть что-то вроде 'reshape2 :: dcast (df, Week ~ Conversion, value.var = "Conversion", marginins = "Conversion") ', все еще не уверен, откуда эти 5 ... –

+0

Ahh Я пропустил это, это должно быть 3, а не 5. A2323 должен был проиллюстрировать, что были больше Точки преобразования, а не только те, которые вы видите в первых 6 строках – KhalidN

ответ

2

Я рекомендовал бы сбросив лишние уровни для того, чтобы не беспорядок вывода, а затем запустить простой table и addmargins сочетание

DF <- droplevels(DF[DF$Conversion != "Null",]) 

addmargins(table(DF[c("Week", "Conversion")]), 2) 
# Conversion 
# Week  A2323 A25177 A3 Sum 
# 2015-25  0  2 1 3 
# 2015-26  0  1 0 1 
# 2015-27  1  1 0 2 

В качестве альтернативы, вы можете сделать то же самое с reshape2 во время задания margins параметра

library(reshape2) 
dcast(DF, Week ~ Conversion, value.var = "Conversion", length, margins = "Conversion") 
#  Week A2323 A25177 A3 (all) 
# 1 2015-25  0  2 1  3 
# 2 2015-26  0  1 0  1 
# 3 2015-27  1  1 0  2 
+0

. Я обнаружил, что ваше предложение с 'reshape2 :: dcast (df, Week ~ Конверсия, value.var = "Конверсия", margin = "Conversion") 'работал как шарм – KhalidN

+0

Базовое решение R тоже не работало? –

+0

Я просто проверил его, и он отлично поработал! спасибо за помощь – KhalidN

0

Альтернативное решение с использованием dplyr и tidyr:

library(tidyr) 
library(dplyr) 

dt = data.frame(Conversion = c("A1","Null","A1","A3"), 
       Lead = c(1,0,1,1), 
       Week = c("2015-25","2015-25","2015-25","2015-26")) 

dt %>% 
    filter(Conversion != "Null") %>% 
    group_by(Week, Conversion) %>% 
    summarise(Lead = sum(Lead)) %>% 
    ungroup() %>% 
    spread(Conversion,Lead,fill=0) %>% 
    group_by(Week) %>% 
    do(data.frame(., 
       Total = sum(.[,-1]))) %>% 
    ungroup() 

#  Week A1 A3 Total 
# 1 2015-25 2 0  2 
# 2 2015-26 0 1  1 
+0

Исправить. Я пропустил вопрос о том, как генерируются 0. Ответ обновлен. – AntoniosK

Смежные вопросы