我有这张桌子:
> 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))
答案 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