2014-11-06 76 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'問題嗎? – 2014-11-06 15:34:33

回答

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 

更新:請注意,如果您更改順序,將重複的列名稱放在最後,它會將w orks

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)%>%summarise_each(funs(max,sum,length),llamado)%>%rename(maxCol = max,q_EDI = sum,reg = length)'。如果您不需要重命名列,則不需要「重命名」部分。你的第三個dplyr答案! +1。 – jazzurro 2014-11-06 15:53:01