转换由fun.aggregate控制的多个value.var

时间:2017-02-15 17:28:15

标签: r dataframe dcast

我有以下数据集

client_id <- c("A", "A", "B", "B", "B", "B", "B", "A", "A", "B", "B")
value <- c(10, 35, 20, 30, 50, 40, 30, 40, 30, 40, 10)
period_30 <- c(1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0)
period_60 <- c(1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0)
sign <- c("D", "D", "D", "D", "C", "C", "C", "D", "D", "D", "D")

data <- data.frame(client_id, value, period_30, period_60, sign)

我可以使用此代码计算每个给定时间段内不同拆分的数量,使用以下代码:

library(data.table)
test<- dcast(setDT(data), client_id ~ paste0("period_30", sign), value.var = "period_30", sum)

但我想根据不同的分割来计算值。

预期结果将如下所示:

client_id       av.value_period_30_sign_D   av.value_period_60_sign_D   av.value_period_30_sign_C   av.value_period_30_sign_D
    A                     34.16667                      NaN                  NaN                                   NaN
    B                     30.00000                    34.16667               NaN                               27.50000

然后,它应该可以扩展到第1期中类型X的附加分割,例如符号X的平均值。

我不确定这种方法是否可以实现所需的输出。但我在看fun.aggregate论证。也许它可以与多个value.var参数结合使用?

更新:Joel的代码回答了问题的第一部分。

client_id   sign    period_30   period_60 
    A         D     34.16667    34.16667
    B         D     30.00000    34.16667
    B         C     NaN         27.50000

但是如何自动转换变量并根据拆分分配名称?

2 个答案:

答案 0 :(得分:1)

另一种方法(会更快)正在使用data.table

基于对问题的编辑:(希望代码现在可以自我解释)

library(data.table)
data1 <- setDT(data)[, lapply(.SD, function(x) mean(value[x==1])),
                      .SDcols = period_30:period_60,
                      by = .(client_id, sign)]
# `dcast` if also from `data.table` package
dcast(data1, client_id~sign, drop = FALSE, value.var = c("period_30", "period_60"))
#   client_id period_30_C period_30_D period_60_C period_60_D
#1:         A          NA    34.16667          NA    34.16667
#2:         B         NaN    30.00000        27.5    34.16667

答案 1 :(得分:0)

可以使用dplyr;鉴于目前的df(=测试):

df %>% group_by(sign) %>% summarize(avg.val=mean(value),avg.period1=mean(period_1),avg.period2=mean(period_2),avg.period3=mean(period_3))

给出:

# A tibble: 2 × 5
    sign avg.val avg.period1 avg.period2 avg.period3
   <chr>   <dbl>       <dbl>       <dbl>       <dbl>
1 Credit   39.50        0.50         1.0           1
2  Debit   36.25        0.25         0.5           1

您可以更改group中的分组变量以满足您的需求。