对于简单的数据框:
client_id<-c("111","111","111","112","113","113","114")
transactions<-c(1,2,2,2,3,17,100)
transactions_sum<-c(5,5,5,2,20,20,100) ##precalculated sums of transaction counts for each client_id
segment<-c("low","low","low","low","low","low","high")
test<-data.frame(client_id,transactions,transactions_sum,segment)
client_id transactions transactions_sum segment
1 111 1 5 low
2 111 2 5 low
3 111 2 5 low
4 112 2 2 low
5 113 3 20 low
6 113 17 20 low
7 114 100 100 high
我试图按细分聚合并计算细分方式。
我期待以下结果:
segment transactions_mean
1 low 9
2 high 100
由于计算均值应考虑重复的client_ids,我们应该对每个段的个别交易计数求和(低段1 + 2 + 2 + 2 + 3 + 17)并除以唯一的client_ids(低段3) ,低段得到27/3 = 9。为每个client_id使用预先计算的总和:(5 + 2 + 20)/ 3 = 9
然而,当我试图运行&#34; dcast&#34;或&#34;聚合&#34;在这些数据上,我得错了数字,因为显然他们将每一行视为一个独特的观察:
dcast(test, segment ~ ., mean, value.var="transactions")
给出
segment .
1 low 4.5
2 high 100.0
有效地说明了它对每个段的事务计数求和(低段的1 + 2 + 2 + 2 + 3 + 17)并除以每个段的观察数(低段为6)而不是唯一的client_id。
在这种情况下,计算均值的正确方法是什么?
答案 0 :(得分:2)
您也可以使用dplyr
library(dplyr)
test_2 <- test %>%
group_by(segment) %>%
summarise (meanTransactions=sum(transactions)/n_distinct(client_id))
test_2
# A tibble: 2 × 2
segment transactions
<chr> <dbl>
1 high 100
2 low 9
答案 1 :(得分:1)
我们可以使用data.table
library(data.table)
setDT(test)[, .(transactions_mean = sum(transactions)/uniqueN(client_id)), by = segment]
# segment transactions_mean
#1: low 9
#2: high 100
答案 2 :(得分:0)
您可以使用:
meanLow <- mean(test$segment == "low")
meanHigh <- mean(test$segment == "high")