dplyr没有总结

时间:2014-11-06 15:13:25

标签: r group-by dplyr summarization

我有这张桌子:

> 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))

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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