正确的计算方式意味着以长格式汇总数据

时间:2017-01-02 12:17:35

标签: r aggregate dcast

对于简单的数据框:

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。

在这种情况下,计算均值的正确方法是什么?

3 个答案:

答案 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")
相关问题