Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R如何按组延迟数据帧_R_Dplyr - Fatal编程技术网

R如何按组延迟数据帧

R如何按组延迟数据帧,r,dplyr,R,Dplyr,我有以下数据集: Name Year VarA VarB Data.1 Data.2 A 2016 L H 100 101 A 2017 L H 105 99 A 2018 L H 103 105 A 2016 L A 90 95 A 2017 L A 99 92 A 2018 L A 102

我有以下数据集:

Name  Year  VarA  VarB Data.1  Data.2
A     2016  L     H    100     101
A     2017  L     H    105     99
A     2018  L     H    103     105
A     2016  L     A    90      95
A     2017  L     A    99      92
A     2018  L     A    102     101
我想通过分组添加一个滞后变量:Name、VarA、VarB,这样我的数据看起来像:

Name  Year  VarA  VarB Data.1  Data.2  Lg1.Data.1 Lg2.Data.1
A     2016  L     H    100     101     NA        NA
A     2017  L     H    105     99      100       NA
A     2018  L     H    103     105     105       100
A     2016  L     A    90      95      NA        NA
A     2017  L     A    99      92      90        NA
A     2018  L     A    102     101     99        90
我发现以下链接很有用:

我使用以下代码:

df <- df %>% 
  group_by(Name) %>% 
  arrange(Name, VarA, VarB, Year) %>% 
  do(data.frame(., setNames(shift(.[,c(5:6)], 1:2), c(seq(1:8)))))

如何为每个新分组组合(例如Name/VarA/VarB)重置滞后时间?

dplyr::lag
用于设置要滞后的距离。在本例中,您可以根据需要的任何变量进行分组,
Name
VarA
VarB
——然后再生成滞后变量

库(dplyr)
df%>%
分组人(姓名、VarA、VarB)%>%
突变(Lg1.Data.1=lag(Data.1,n=1),Lg2.Data.1=lag(Data.1,n=2))
#>#tibble:6 x 8
#>#组:名称、VarA、VarB[2]
#>名称年份VarA VarB Data.1 Data.2 Lg1.Data.1 Lg2.Data.1
#>                      
#>1 A 2016 L H 100 101 NA NA
#>2 A 2017 L H 105 99 100 NA
#>3 A 2018 L H 103 105 100
#>4 A 2016 L A 90 95 NA
#>5 A 2017 L A 99 92 90 NA
#>6 A 2018 L A 102 101 99 90
如果您想要一个扩展到更多滞后的版本,可以使用一些来动态创建新的滞后列。我将使用
purrr::map
对一组要延迟的
n
进行迭代,创建一个添加了新列的数据帧列表,然后将所有数据帧连接在一起。也许有更好的方法可以做到这一点,所以希望有人可以改进它

我正在编一些新数据,只是为了有更广泛的年份来说明。在
mutate
中,您可以使用
quo_name
创建列名

库(dplyr)
图书馆(purrr)
种子(127)
df%
变异(!!quo_名称(paste0(“Lag”,i)):=dplyr::Lag(Data.1,n=i))
})
你不需要保存这个列表,我只是想展示一个数据帧的例子。您可以直接进入
reduce

df_列表[[3]]
#>#tibble:10 x 7
#>#组:名称、VarA、VarB[2]
#>名称年份VarA VarB Data.1 Data.2 Lag3
#>            
#>1 A 2016 L H 3 9 NA
#>2 A 2017 L H 1 4 NA
#>3 A 2018 L H 3 8 NA
#>4 A 2019 L H 2 3
#>5 A 2020 L H 4 5 1
#>6 A 2016 L A 8 4 NA
#>7 A 2017 L A 6 8 NA
#>8 A 2018 L A 3 2 NA
#>9 A 2019 L A 8 6 8
#>10 A 2020 L A 9 1 6
然后使用
purrr::reduce
连接列表中的所有数据帧。由于每个数据帧中都有相同的列,而这些列正是您想要连接的列,因此您可以在
内部连接中不指定“按列连接”

reduce(df_列表,内部_连接)
#>加入,按=c(“名称”、“年份”、“变量”、“变量”、“数据1”、“数据2”)
#>加入,按=c(“名称”、“年份”、“变量”、“变量”、“数据1”、“数据2”)
#>加入,按=c(“名称”、“年份”、“变量”、“变量”、“数据1”、“数据2”)
#>#tibble:10 x 10
#>#组:名称、变量、变量[?]
#>名称年份VarA VarB Data.1 Data.2 Lag1 Lag2 Lag3 Lag4
#>               
#>1 A 2016 L H 3 9不适用不适用不适用
#>2 A 2017 L H 1 4 3 NA NA NA
#>3 A 2018 L H 3 8 1 3 NA
#>4 A 2019 L H 2 3 1 3 NA
#>5 A 2020 L H 4 5 2 3 1 3
#>6 A 2016 L A 8 4不适用
#>7 A 2017 L A 6 8不适用
#>8 A 2018 L A 3 2 6 8 NA
#>9 A 2019 L A 8 6 3 6 8 NA
#>10 A 2020 L A 9 1 8 3 6 8

由(v0.2.1)

于2018-12-07创建,我想你会
groupby(Name,VarA,VarB)
而不仅仅是
groupby(Name)
。即将发布
df%>%groupby(Name,VarA,VarB)%>%在(vars)(以(“数据”)开始)、funs(Lg=lag)()
。在我看来,它更健壮。谢谢Ronak和Camille。两种解决方案都解决了我的问题。Ronak-有没有比多次运行代码以获得多年收益更优雅的方法?
Name  Year  VarA  VarB Data.1  Data.2  Lg1.Data.1 Lg2.Data.1
A     2016  L     H    100     101     NA        NA
A     2017  L     H    105     99      100       NA
A     2018  L     H    103     105     105       100
A     2016  L     A    90      95      103       105
A     2017  L     A    99      92      90        103
A     2018  L     A    102     101     99        90