从面板数据中提取 R 数据
R data extraction from panel data
我在 table 中有一个很长的时间序列,我想从中提取值。
专家组每天都有观察结果,但有些 NA。我想从每个横截面中提取最后一个非 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 的新手,非常感谢您的建议。
*编辑
table的结构:
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>
你可以试试
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)])] )
更新
如果所有 'x' 个元素对于 'xsection' 组都是 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")
我在 table 中有一个很长的时间序列,我想从中提取值。
专家组每天都有观察结果,但有些 NA。我想从每个横截面中提取最后一个非 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 的新手,非常感谢您的建议。
*编辑 table的结构:
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>
你可以试试
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)])] )
更新
如果所有 'x' 个元素对于 'xsection' 组都是 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")