2014-11-06 2 views
-1

У меня есть эта таблица:dplyr не суммируя

> prueba 
    rutcli elegidosi llamado pago 
1 4863  NA  0 0 
2 7605  NA  1 1 
3 10669  NA  1 1 
4 10669  NA  1 1 
5 11980  NA  1 1 
6 17045  NA  0 1 
7 31259  NA  1 1 
8 31259  NA  1 1 
9 40547  NA  1 1 
10 66455  NA  1 1 

Мне нужно группе клиента и получить некоторые метрики:

library(dplyr) 
by_cli<-group_by(prueba, rutcli,add = TRUE) 
summarise(by_cli,   
      llamado=max(llamado, na.rm=TRUE), 
      q_EDI=sum(llamado, na.rm=TRUE), reg=length(llamado)) 

Source: local data frame [8 x 4] 

И результат:

rutcli llamado q_EDI reg 
1 4863  0  0 1 
2 7605  1  1 1 
3 10669  1  1 1 
4 11980  1  1 1 
5 17045  0  0 1 
6 31259  1  1 1 
7 40547  1  1 1 
8 66455  1  1 1 

Так , Я не получаю сумму (клиент 10669 и 31259 были дважды).

Я также попытался следующие и получили те же результаты:

prueba %>% 
group_by(rutcli) %>% 
summarise(llamado=max(llamado, na.rm=TRUE),q_EDI=sum(llamado, na.rm=TRUE), 
      reg=length(llamado)) 
+4

Не был ли этот вопрос 'dplyr'? –

ответ

1

Вы переназначение llamado, а затем суммируя снова. Вот пример с функцией ddply. Другой вариант - использовать другое имя для вызова max(llamado).

d <- read.table(header=T, text=' 
rutcli elegidosi llamado pago 
    4863  NA  0 0 
    7605  NA  1 1 
    10669  NA  1 1 
    10669  NA  1 1 
    11980  NA  1 1 
    17045  NA  0 1 
    31259  NA  1 1 
    31259  NA  1 1 
    40547  NA  1 1 
    66455  NA  1 1') 

# wrong way 
ddply(d, .(rutcli), summarize, llamado=max(llamado), q_EDI=sum(llamado), reg=length(llamado)) 
> ddply(d, .(rutcli), summarize, llamado=max(llamado), q_EDI=sum(llamado), reg=length(llamado)) 
    rutcli llamado q_EDI reg 
1 4863  0  0 1 
2 7605  1  1 1 
3 10669  1  1 1 
4 11980  1  1 1 
5 17045  0  0 1 
6 31259  1  1 1 
7 40547  1  1 1 
8 66455  1  1 1 

# The Right way 
ddply(d, .(rutcli), summarize, q_EDI=sum(llamado), llamado=max(llamado), reg=length(llamado)) 
> ddply(d, .(rutcli), summarize, q_EDI=sum(llamado), llamado=max(llamado), reg=length(llamado)) 
    rutcli q_EDI llamado reg 
1 4863  0  0 1 
2 7605  1  1 1 
3 10669  2  1 1 
4 11980  1  1 1 
5 17045  0  0 1 
6 31259  2  1 1 
7 40547  1  1 1 
8 66455  1  1 1 
4

Поскольку вы уже назначили столбец llamado до максимального значения, которое 1.

Просто переименовать столбец

df %>% 
    group_by(rutcli) %>% 
    summarise(maxCol = max(llamado, na.rm = TRUE), 
       q_EDI = sum(llamado, na.rm = TRUE), 
       reg = length(llamado)) 

# rutcli maxCol q_EDI reg 
# 1 4863  0  0 1 
# 2 7605  1  1 1 
# 3 10669  1  2 2 
# 4 11980  1  1 1 
# 5 17045  0  0 1 
# 6 31259  1  2 2 
# 7 40547  1  1 1 
# 8 66455  1  1 1 

Обновление: Обратите внимание, что если вы измените заказ, поместив дублируемое имя столбца последним, Орки

df %>% 
    group_by(rutcli) %>% 
    summarize(q_EDI = sum(llamado, na.rm = TRUE), 
       reg = length(llamado), 
       llamado = max(llamado, na.rm = TRUE)) 
# rutcli q_EDI reg llamado 
# 1 4863  0 1  0 
# 2 7605  1 1  1 
# 3 10669  2 2  1 
# 4 11980  1 1  1 
# 5 17045  0 1  0 
# 6 31259  2 2  1 
# 7 40547  1 1  1 
# 8 66455  1 1  1 
+3

Вы можете сделать: 'df%>% group_by (rutcli)%>% summaryise_each (funs (max, sum, length), llamado)%>% rename (maxCol = max, q_EDI = sum, reg = length)'. Если вам не нужно переименовывать столбцы, часть 'rename' не нужна. Ваш третий ответ dplyr! +1. – jazzurro