【问题标题】:Take difference between observations within same group with a reference observation将同一组内的观察值与参考观察值进行比较
【发布时间】:2019-03-07 05:02:14
【问题描述】:
test <- data.frame('prod_id'= c("shoe", "shoe", "shoe", "shoe", "shoe", "shoe", "boat", "boat","boat","boat","boat","boat"), 
               'seller_id'= c("a", "b", "c", "d", "e", "f", "a","g", "h", "r", "q", "b"), 
               'Dich'= c(1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0),
               'price' = c(120, 20, 10, 4, 3, 4, 30, 43, 56, 88, 75, 44)
                )
test

       prod_id seller_id Dich price
 1     shoe         a    1   120
 2     shoe         b    0    20
 3     shoe         c    0    10
 4     shoe         d    0     4
 5     shoe         e    0     3
 6     shoe         f    0     4
 7     boat         a    0    30
 8     boat         g    0    43
 9     boat         h    1    56
10     boat         r    0    88
11     boat         q    0    75
12     boat         b    0    44

因此,我想创建一个新列,根据 Dich 的值获取价格列中观察值之间的差异,其中每个观察值与每个 prod_id 组中 Dich==1 的观察值取其差异。

下面是我想要的结果。

       prod_id seller_id Dich price diff_p
 1     shoe         a    1   120      0
 2     shoe         b    0    20     -100
 3     shoe         c    0    10     -110
 4     shoe         d    0     4     -116
 5     shoe         e    0     3     -117
 6     shoe         f    0     4     -116
 7     boat         a    0    30     -26
 8     boat         g    0    43     -13
 9     boat         h    1    56       0
10     boat         r    0    88      32
11     boat         q    0    75      19
12     boat         b    0    44     -12

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    按 'prod_id' 分组后,取 'price' 和 'price' 之差,其中 'Dich' 为 1

    library(dplyr)
    test %>% 
        group_by(prod_id) %>%
        mutate(diff_p = price - price[Dich == 1])
    # A tibble: 12 x 5
    # Groups:   prod_id [2]
    #   prod_id seller_id  Dich price diff_p
    #   <fct>   <fct>     <dbl> <dbl>  <dbl>
    # 1 shoe    a             1   120      0
    # 2 shoe    b             0    20   -100
    # 3 shoe    c             0    10   -110
    # 4 shoe    d             0     4   -116
    # 5 shoe    e             0     3   -117
    # 6 shoe    f             0     4   -116
    # 7 boat    a             0    30    -26
    # 8 boat    g             0    43    -13
    # 9 boat    h             1    56      0
    #10 boat    r             0    88     32
    #11 boat    q             0    75     19
    #12 boat    b             0    44    -12
    

    或使用data.table

    library(data.table)
    setDT(test)[, diff_p := price - price[Dich == 1], prod_id]
    

    【讨论】:

    • 太棒了,我原以为我需要使用 select() 函数或子集,但无法弄清楚,我的大脑很累(新手)。干杯!
    • @DanielKreitzberg 错误是否与特定“prod_id”有多个 1 有关?或者你有一些没有 1 的 'Dich 的 'prod_id'
    • @DanielKreitzberg 如果问题与特定 'prod_id' 的 'Dich' 中没有 1 相关,test %&gt;% group_by(prod_id) %&gt;% mutate(diff_p = if(any(Dich ==1)) price -price[Dich == 1] else price)
    • 如果一个'prod_id'中的'Dich'有多个1,则条件不明确
    • @DanielKreitzberg 如果有多个1,不清楚你拿哪一个作为与价格的t差
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多