【问题标题】:Calculate mean value for ID keeping Panel Data Shape计算 ID 保持面板数据形状的平均值
【发布时间】:2017-08-04 11:55:39
【问题描述】:

下午好, 我有以下问题希望有人可以帮助我找到正确的解决方案。 情况如下: 假设,一个人有一个不平衡的面板数据集

| ID |  Value  |  Time  |
| 1  |   12    |  2011  | 
| 1  |    8    |  2012  |
| 1  |   10    |  2013  |
| 2  |   24    |  2011  |
| 2  |   10    |  2012  |
| 3  |    1    |  2011  |
| 3  |    8    |  2012  |
| 3  |    2    |  2013  |

我尝试做的是计算每个 ID 的平均值,并为该个人的每一年插入这个值。结果应如下所示:

| ID |  Value  |  Time  |
| 1  |   10    |  2011  | 
| 1  |   10    |  2012  |
| 1  |   10    |  2013  |
| 2  |   17    |  2011  |
| 2  |   17    |  2012  |
| 3  |    4    |  2011  |
| 3  |    4    |  2012  |
| 3  |    4    |  2013  |

我见过很多相同类型的问题,但没有解决方案保留面板数据形式。有谁知道如何在 R 中解决这个问题?

【问题讨论】:

    标签: r panel transformation


    【解决方案1】:
    library(dplyr)
    
    df <- data.frame(ID = c(1,1,1,2,2,3,3,3), 
                     Value = c(12,8,10,24,10,1,8,2), 
                     Time = c(2011,2012,2013,2011,2012,2011,2012,2013))
    
    df %>% 
      group_by(ID) %>% 
      summarise(Value = round(mean(Value))) %>% 
      right_join(df %>% select(-Value), by ="ID")
    
    # A tibble: 8 x 3
         ID Value  Time
      <dbl> <dbl> <dbl>
    1     1    10  2011
    2     1    10  2012
    3     1    10  2013
    4     2    17  2011
    5     2    17  2012
    6     3     4  2011
    7     3     4  2012
    8     3     4  2013
    

    编辑

    正如 Sotos 在下面指出的,这是一个更好的解决方案:

    df %>% group_by(ID) %>% mutate(Value = round(mean(Value)))
    

    【讨论】:

    • 为什么不直接使用mutate 并完成它呢? df %&gt;% group_by() %&gt;% mutate(value = mean(Value)))
    • 因为我还没有喝完今天的第一杯咖啡。 (您从group_by 中漏掉了ID,看起来Value 应该四舍五入到最接近的整数。)
    • 呵呵...当然是咖啡...星期一))
    【解决方案2】:

    有了data.table,这变成了“单线”:

    library(data.table)
    setDT(df)[, Value := round(mean(Value)), by = ID][]
    
          ID Value  Time
    1:     1    10  2011
    2:     1    10  2012
    3:     1    10  2013
    4:     2    17  2011
    5:     2    17  2012
    6:     3     4  2011
    7:     3     4  2012
    8:     3     4  2013
    

    数据

    df <- fread(
      "| ID |  Value  |  Time  |
    | 1  |   12    |  2011  | 
    | 1  |    8    |  2012  |
    | 1  |   10    |  2013  |
    | 2  |   24    |  2011  |
    | 2  |   10    |  2012  |
    | 3  |    1    |  2011  |
    | 3  |    8    |  2012  |
    | 3  |    2    |  2013  |",
      sep = "|", drop = c(1L, 5L))
    

    【讨论】:

      【解决方案3】:

      ave 的基础 R 解决方案,

      round(ave(df$Value, df$ID))
      #[1] 10 10 10 17 17  4  4  4
      

      【讨论】:

        猜你喜欢
        • 2021-04-30
        • 1970-01-01
        • 2011-06-24
        • 1970-01-01
        • 2016-05-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-23
        相关资源
        最近更新 更多