【问题标题】:R data extraction from panel data从面板数据中提取 R 数据
【发布时间】:2015-04-08 12:14:40
【问题描述】:

我想从中提取值的表中有很长的时间序列。

小组有每日观察,但有些不适用。我想将每个横截面的最后一个非 NA 值提取到一个新的时间序列中。它应该转到相同的横截面,并用提取的值填充该横截面内的所有观察值。即新的时间序列将由堆叠的横截面组成,每个 t 都有数据。

我在下面的结构中做了一个示例,其中 x 是我要从中提取数据的系列,NEW 是我要创建的新系列。

xsection  t       x       NEW
01_00 2000-01-01 146,16 147,2
01_00 2000-01-02 147,2  147,2
01_00 2000-01-03 NA     147,2
02_00 2000-01-01 NA     148,3
02_00 2000-01-02 148,3  148,3
02_00 2000-01-03 NA     148,3
03_00 2000-01-01 145,9  147,4
03_00 2000-01-02 NA     147,4
03_00 2000-01-03 147,4  147,4

我还创建了一个 pdata.frame,其中在同一行中指定了横截面和时间 ID。

row.names              x
01_00-2000-01-01    146.16  
01_00-2000-01-02    147,2   
01_00-2000-01-03    NA  

我是 R 新手,非常感谢您的建议。

*编辑 表结构:

Classes ‘data.table’ and 'data.frame':  7212530 obs. of  6 variables:
 $ var01 : Factor w/ 1018 levels "01_00","01_01",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ id01  : Factor w/ 7085 levels "1995-09-25","1995-09-26",..: 1 2 3 4 5 6 7 8 9 10 ...
 $ spot  : num  146 146 145 146 147 ...
 $ weekly: num  NA NA NA NA NA NA NA NA NA NA ...
 $ NEW   : num  241 241 241 241 241 ...
 $ NEW3  : num  241 241 241 241 241 ...
 - attr(*, ".internal.selfref")=<externalptr> 

【问题讨论】:

    标签: r extraction panel-data


    【解决方案1】:

    你可以试试

    library(data.table)
    setDT(df1)[order(t), NEW:=tail(x[!is.na(x)],1), xsection][]
    #   xsection          t      x   NEW
    #1:    01_00 2000-01-01 146,16 147,2
    #2:    01_00 2000-01-02  147,2 147,2
    #3:    01_00 2000-01-03     NA 147,2
    #4:    02_00 2000-01-01     NA 148,3
    #5:    02_00 2000-01-02  148,3 148,3
    #6:    02_00 2000-01-03     NA 148,3
    #7:    03_00 2000-01-01  145,9 147,4
    #8:    03_00 2000-01-02     NA 147,4
    #9:    03_00 2000-01-03  147,4 147,4
    

    或者

    library(dplyr)
    df1 %>%
       group_by(xsection) %>%
       arrange(t) %>%
       mutate(NEW= tail(x[!is.na(x)],1))
    

    或者

    df1 %>%
        group_by(xsection) %>%
        mutate(NEW=  x[!is.na(x)][which.max(t[!is.na(x)])] )
    

    更新

    如果'xsection'组的所有'x'元素都是NA,我们可以将第一个解决方案修改为

     setDT(df1)[order(t), NEW:=if(all(is.na(x))) x[1L] 
                          else tail(x[!is.na(x)],1), xsection][]
    

    数据

    df1 <- structure(list(xsection = c("01_00", "01_00", "01_00", "02_00", 
    "02_00", "02_00", "03_00", "03_00", "03_00"), t = structure(c(10957, 
    10958, 10959, 10957, 10958, 10959, 10957, 10958, 10959), 
     class = "Date"), 
    x = c("146,16", "147,2", NA, NA, "148,3", NA, "145,9", NA, 
    "147,4")), .Names = c("xsection", "t", "x"), row.names = c(NA, 
    -9L), class = "data.frame")
    

    【讨论】:

    猜你喜欢
    • 2015-02-02
    • 1970-01-01
    • 2012-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-24
    相关资源
    最近更新 更多