楼主: 我隐身啦
27980 23

[问答] 关于R语言滞后的问题 [推广有奖]

  • 0关注
  • 0粉丝

大专生

25%

还不是VIP/贵宾

-

威望
0
论坛币
124 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
725 点
帖子
42
精华
0
在线时间
37 小时
注册时间
2014-10-6
最后登录
2016-8-7

楼主
我隐身啦 发表于 2015-12-10 11:24:17 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
请教一个问题。
我想对某一列求滞后,但是是对不同企业分别滞后。我用了lag(x,n=1L),但是这一列全滞后了,没有按企业分开。怎么解决?求帮忙。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:R语言 lag 求帮忙

回帖推荐

蓝色 发表于16楼  查看完整内容

正在尝试 找不到一个函数能产生一个被软件认为是季度的变量yq最后两句改成下面就可以了。但是还没有找到 data

蓝色 发表于12楼  查看完整内容

suimong 发表于9楼  查看完整内容

我明白了,你是针对每个企业都有一组日期,范围在2005/3/31-2014/12/31,但是可能企业A缺了2014/06/30,企业B缺了2013/09/30,是不是这样?如果是这种情况的话,那就是要按照分组inner_join了,这个任务dplyr就没法胜任了。我们可以用plyr里的ddply:

suimong 发表于7楼  查看完整内容

这样的话你只要把日期列给补齐就可以了。假设日期从2005/3/31开始,到2014/12/31结束,那么你先生成一个日期序列: right_join保证了所有dt内的值都会出现在DF$Accper中,同时对于原来不存在的Accper中的值(例如2006/3/31),该行的其他列就会被自动填充NA。这时候你再lag的话就会有你想要的效果了。

沙发
suimong 发表于 2015-12-10 14:43:12
建议你把数据结构补充一下方便别人回答你的问题。我这里假定你是一个data frame叫DF,你有一个包含企业名字的列,假定叫“companies", 然后你要求lag的列叫"V1",那么你可以用dplyr,先按照"companies"列分组,再进行lag,那么结果就是会对不同的企业分别lag。
  1. DF %>%
  2.   group_by(companies) %>%
  3.   mutate(V2 = lag(V1, n=1L) ->
  4.   DF
复制代码

藤椅
我隐身啦 发表于 2015-12-10 16:13:28
suimong 发表于 2015-12-10 14:43
建议你把数据结构补充一下方便别人回答你的问题。我这里假定你是一个data frame叫DF,你有一个包含企业名字 ...
你好,非常感谢你,按照你的方法可以了。但是我是想按时间滞后的,按季度滞后,公司是可以了,但是季度滞后没有解决,出现了这种情况。我想让如果没有3月份,6月份的滞后一期就是NA,怎么同时做到这两个??

板凳
我隐身啦 发表于 2015-12-10 16:22:02
suimong 发表于 2015-12-10 14:43
建议你把数据结构补充一下方便别人回答你的问题。我这里假定你是一个data frame叫DF,你有一个包含企业名字 ...
Stkcd          Accper             size                            V1
4        2014/3/31          253126108.2       
4        2014/6/30                275964182.4     253126108.2
4        2014/9/30                283038604.3         275964182.4
4        2014/12/31        338282581.1        283038604.3
5        2005/3/31               1800641798                     NA
5        2005/6/30          1773051158        1800641798
5        2005/9/30          1781712610        1773051158
5        2005/12/31        1643873315        1781712610
5        2006/6/30               1559309892         1643873315
5        2006/12/31        1528293792         1559309892

不知道是不是图片看不到。比如这样,2006年6月份的不应该有滞后一期的,因为没有3月份的数据。该怎么同时和按企业滞后一起做到?

报纸
我隐身啦 发表于 2015-12-10 16:22:21
suimong 发表于 2015-12-10 14:43
建议你把数据结构补充一下方便别人回答你的问题。我这里假定你是一个data frame叫DF,你有一个包含企业名字 ...
Stkcd          Accper             size                            V1
4        2014/3/31          253126108.2       
4        2014/6/30                275964182.4     253126108.2
4        2014/9/30                283038604.3         275964182.4
4        2014/12/31        338282581.1        283038604.3
5        2005/3/31               1800641798                     NA
5        2005/6/30          1773051158        1800641798
5        2005/9/30          1781712610        1773051158
5        2005/12/31        1643873315        1781712610
5        2006/6/30               1559309892         1643873315
5        2006/12/31        1528293792         1559309892

不知道是不是图片看不到。比如这样,2006年6月份的不应该有滞后一期的,因为没有3月份的数据。该怎么同时和按企业滞后一起做到?

地板
我隐身啦 发表于 2015-12-10 16:22:48
suimong 发表于 2015-12-10 14:43
建议你把数据结构补充一下方便别人回答你的问题。我这里假定你是一个data frame叫DF,你有一个包含企业名字 ...
Stkcd          Accper             size                            V1
4        2014/3/31          253126108.2       
4        2014/6/30                275964182.4     253126108.2
4        2014/9/30                283038604.3         275964182.4
4        2014/12/31        338282581.1        283038604.3
5        2005/3/31               1800641798                     NA
5        2005/6/30          1773051158        1800641798
5        2005/9/30          1781712610        1773051158
5        2005/12/31        1643873315        1781712610
5        2006/6/30               1559309892         1643873315
5        2006/12/31        1528293792         1559309892

不知道是不是图片看不到。比如这样,2006年6月份的不应该有滞后一期的,因为没有3月份的数据。该怎么同时和按企业滞后一起做到?

7
suimong 发表于 2015-12-11 02:52:52
这样的话你只要把日期列给补齐就可以了。假设日期从2005/3/31开始,到2014/12/31结束,那么你先生成一个日期序列:
  1. # 在起始日期上先加一天是为了避免碰到小月时溢出至下个月
  2. dt<-seq(as.Date("2005/3/31")+1,
  3. as.Date("2014/12/31")+1, by = "1 quarter")-1
  4. dt<-data.frame(DATE = dt)

  5. # 假设你的数据为DF,日期列是Accper?
  6. DF %>%
  7.   right_join(dt, by = c("Accper" = "DATE")) ->
  8. DF
复制代码


right_join保证了所有dt内的值都会出现在DF$Accper中,同时对于原来不存在的Accper中的值(例如2006/3/31),该行的其他列就会被自动填充NA。这时候你再lag的话就会有你想要的效果了。

8
我隐身啦 发表于 2015-12-11 15:23:44 来自手机
suimong 发表于 2015-12-11 02:52
这样的话你只要把日期列给补齐就可以了。假设日期从2005/3/31开始,到2014/12/31结束,那么你先生成一个日期 ...
谢谢。我试了一下,但是我发现并没有补齐。因为dt里的所有四十个日期在Accper里的日期都有,所有合并后没有什么变化。它并不是按照每家企业分别合并,所以原来少日期的企业依然少日期。我按企业分组了(group_by),仍然是这样。怎么解决?

9
suimong 发表于 2015-12-11 16:18:17
我明白了,你是针对每个企业都有一组日期,范围在2005/3/31-2014/12/31,但是可能企业A缺了2014/06/30,企业B缺了2013/09/30,是不是这样?如果是这种情况的话,那就是要按照分组inner_join了,这个任务dplyr就没法胜任了。我们可以用plyr里的ddply:
  1. library(plyr)
  2. ddply(.data = DF,
  3.       .variables = "companies",
  4.       .fun = function(x) right_join(x, dt, by = c("Accper" = "DATE")))
复制代码

10
我隐身啦 发表于 2015-12-11 18:58:59
suimong 发表于 2015-12-11 16:18
我明白了,你是针对每个企业都有一组日期,范围在2005/3/31-2014/12/31,但是可能企业A缺了2014/06/30,企业 ...
您好,我生成了日期序列DATE,然后运行了下面程序:
library(plyr)
A13 <- ddply(.data = A12,
      .variables = "Stkcd",
      .fun = function(A12) right_join(A12, dt, by = c("Accper" = "DATE")))
但是出现了这样的结果:
Error in .fun(piece, ...) : could not find function "right_join"
而且把right_join改成inner_join也是错。请问怎么回事?

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-1 12:28