2014-11-06 126 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