【问题标题】:Casting multiple value.var controled by fun.aggregate转换由 fun.aggregate 控制的多个 value.var
【发布时间】:2017-02-15 17:28:15
【问题描述】:

我有以下数据集

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

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

【问题讨论】:

    标签: r dataframe dcast


    【解决方案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
    

    【讨论】:

    • 你好乔尔,我刚刚更新了这个问题。实际上,您的代码回答了问题的第一部分。您知道如何解决转置/命名部分吗?这对我非常有帮助。
    • 谢谢乔尔!它是一个救生员:)
    • 嗨乔尔,我一直在用不同的数据集测试代码,我意识到分组失败了。因此,如果有多个用户或签名,则结果不正确。你知道可能出了什么问题吗?它适用于一个用户。
    • 或许与此类似的解决方案可能是:check
    【解决方案2】:

    可以使用dplyr;给定当前的 df (=test):

    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 中的分组变量以满足您的需要。

    【讨论】:

    • 我需要按多个拆分进行分组 - 客户、签名、类型。其次,使用这种方法,您必须手动标记每个变量。因此,如果我有 10 个句点、10 个标志、10 种类型,就不可能实现:/ 这就是为什么我不能依赖 dcast。
    • 如果我理解正确,对于第二部分,您可以使用 summarise_each。您也可以按多个变量分组。我只是在处理你提供的 df。
    猜你喜欢
    • 2015-10-05
    • 2018-09-22
    • 2016-03-16
    • 1970-01-01
    • 2021-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    相关资源
    最近更新 更多