【问题标题】:dplyr not summing updplyr 没有总结
【发布时间】:2014-11-06 15:13:24
【问题描述】:

我有这张桌子:

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

【问题讨论】:

  • 这不是dplyr 的问题吗?

标签: r group-by dplyr summarization


【解决方案1】:

因为您已经将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

【讨论】:

  • 你可以这样做:df %&gt;% group_by(rutcli) %&gt;% summarise_each(funs(max, sum, length), llamado) %&gt;% rename(maxCol = max, q_EDI = sum, reg = length)。如果您不必重命名列,则不需要 rename 部分。您的第三个 dplyr 答案! +1。
【解决方案2】:

您正在重新分配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

【讨论】:

    猜你喜欢
    • 2017-09-14
    • 2021-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-22
    • 2015-06-27
    • 2019-06-26
    相关资源
    最近更新 更多