小编Mat*_*att的帖子

在plm中向前滞后

这是一个非常简单的问题,但我无法找到明确的答案,所以我想我会问它.我使用该plm包来处理面板数据.我试图使用该lag函数及时滞后变量FORWARD(默认是从前一个句点检索值,我想要NEXT中的值).我发现了一些旧的文章/问题(大约2009年),这表明这可以k=-1作为一个论点使用.但是,当我尝试这个时,我收到一个错误.

示例代码:

library(plm)
df<-as.data.frame(matrix(c(1,1,1,2,2,3,20101231,20111231,20121231,20111231,20121231,20121231,50,60,70,120,130,210),nrow=6,ncol=3))
names(df)<-c("individual","date","data")
df$date<-as.Date(as.character(df$date),format="%Y%m%d")
df.plm<-pdata.frame(df,index=c("individual","date"))
Run Code Online (Sandbox Code Playgroud)

滞后:

lag(df.plm$data,0)
##returns
1-2010-12-31 1-2011-12-31 1-2012-12-31 2-2011-12-31 2-2012-12-31 3-2012-12-31 
         50           60           70          120          130          210

lag(df.plm$data,1)
##returns
1-2010-12-31 1-2011-12-31 1-2012-12-31 2-2011-12-31 2-2012-12-31 3-2012-12-31 
         NA           50           60           NA          120           NA

lag(df.plm$data,-1)
##returns
Error in rep(1, ak) : invalid 'times' argument
Run Code Online (Sandbox Code Playgroud)

我还读到了plm.data已经取代pdata.frame某些应用程序的内容plm.但是,plm.data似乎根本没有使用该lag功能:

df.plm<-plm.data(df,indexes=c("individual","date"))
lag(df.plm$data,1)
##returns
[1]  50  60  70 120 130 210
attr(,"tsp")
[1] 0 5 1
Run Code Online (Sandbox Code Playgroud)

我将不胜感激任何帮助.如果有人有另外一个包裹用于滞后的建议,我会全力以赴.然而,我确实喜欢plm …

r lag plm

8
推荐指数
1
解决办法
4332
查看次数

R - 加快近似日期匹配.idata.frame?

我正在努力有效地在两个数据帧之间执行"关闭"日期匹配.这个问题探讨了idata.frameplyr包中使用的解决方案,但我也非常满意其他建议的解决方案.

这是两个数据框的非常简单的版本:

sampleticker<-data.frame(cbind(ticker=c("A","A","AA","AA"),
  date=c("2005-1-25","2005-03-30","2005-02-15","2005-04-21")))
sampleticker$date<-as.Date(sampleticker$date,format="%Y-%m-%d")

samplereport<-data.frame(cbind(ticker=c("A","A","A","AA","AA","AA"),
  rdate=c("2005-2-15","2005-03-15","2005-04-15",
  "2005-03-01","2005-04-20","2005-05-01")))
samplereport$rdate<-as.Date(samplereport$rdate,format="%Y-%m-%d")
Run Code Online (Sandbox Code Playgroud)

在实际数据中,sampleticker超过30,000行有40列,samplereport近300,000行有25列.

我想要做的是合并两个数据框,以便每一行sampleticker与最近的日期匹配组合,其中日期匹配samplereport发生在日期之后sampleticker.我在过去通过对股票代码字段进行简单合并,对升序进行排序,然后选择股票代码和日期的唯一组合来解决类似的问题.但是,由于此数据集的大小,合并会非常快速地爆发.

尽我所知,merge不允许这种近似匹配.我已经看到了一些使用的解决方案findInterval,但由于日期之间的距离会有所不同,我不确定我是否可以指定适用于所有行的间隔.

这里发表另一篇文章后,我编写了以下代码,用于adply每一行并执行连接:

library(plyr)
merge<-adply(sampleticker,1,function(x){
  y<-subset(samplereport,ticker %in% x$ticker & rdate > x$date)
  y[which.min(y$rdate),]
  }))
Run Code Online (Sandbox Code Playgroud)

这很好用:对于样本数据,我得到了下面的内容,这就是我想要的.

   date       ticker      rdate
 1 2005-01-25  A          2005-02-15
 2 2005-03-30  A          2005-04-15
 3 2005-02-15  AA         2005-03-01
 4 2005-04-21  AA         2005-05-01
Run Code Online (Sandbox Code Playgroud)

但是,由于代码执行了30,000多个子集操作,因此速度极慢:我在最终查杀之前运行了上述查询超过一天.

在这里看到plyr 1.0有一个结构,idata.frame它通过引用调用数据帧,大大加快了子集化操作.但是,我无法使用以下代码:

isamplereport<-idata.frame(samplereport)
adply(sampleticker,1,function(x){
  y<-subset(isamplereport,isamplereport$ticker %in% x$ticker & 
    isamplereport$rdate …
Run Code Online (Sandbox Code Playgroud)

r subset plyr data.table

7
推荐指数
2
解决办法
2184
查看次数

有效地检查data.table中其他行的值

注意:这是我最初发布到data.table帮助组的问题.Matt Dowle要求提供一个更详细的例子,我发布了这个例子,但我在电子邮件格式化方面遇到了麻烦.我已经知道如何格式化SO,所以我想我会在这里发布它.

我基本上尝试做的是基于该行的值以及前一行或后一行中的值来自data.table的子集行.现在,我正在为将来和过去的行创建新列,然后在这些列上键入data.table,但这是资源密集型和繁重的.

下面的例子说明了我现在使用的方法.该示例使用文档中的单词(我使用数字索引).我想为特定单词进行子集化,但前提是它前面或后面跟着另一个单词或一组单词:

我首先创建一个包含十个包含一百万个单词的文档的虚拟数据集.集合中有三个独特的单词.

library(data.table)
set.seed(1000)
DT<-data.table(wordindex=sample(1:3,1000000,replace=T),docindex=sample(1:10,1000000,replace=T))
setkey(DT,docindex)
DT[,position:=seq.int(1:.N),by=docindex]


          wordindex docindex position
      1:         1        1        1
      2:         1        1        2
      3:         3        1        3
      4:         3        1        4
      5:         1        1        5
    ---                            
 999996:         2       10    99811
 999997:         2       10    99812
 999998:         3       10    99813
 999999:         1       10    99814
1000000:         3       10    99815
Run Code Online (Sandbox Code Playgroud)

请注意,简单地计算所有文档中第一个唯一单词的出现次数非常简单.

setkey(DT,wordindex)
count<-DT[J(1),list(count.1=.N),by=docindex]
count

    docindex count.1
 1:        1   33533
 2:        2   33067
 3:        3   33538
 4:        4   33053
 5:        5   33231 …
Run Code Online (Sandbox Code Playgroud)

r data.table

6
推荐指数
1
解决办法
1625
查看次数

分段错误使用R中的xts对象列表

我在处理xts对象列表时遇到问题.lapply在列表元素上运行时,我会遇到不同的奇怪行为,有时程序会出现段错误.我在Ubuntu 9.10上运行R 2.12.2,虽然我在Windows XP上运行2.13.1时遇到了类似的问题.

我试图将包含季度财务数据的数据框拆分为多个时间序列.我在CIK代码上拆分数据帧,这是一个整数.数据框是:

> head(CQ[,c("datadate","fqtr","cik","ibq","mkvaltq","prccq","sic")])
    datadate fqtr    cik     ibq    mkvaltq prccq  sic
3 2009-12-31    1  61478   3.400  601.12800  6.21 3661
4 2010-03-31    2  61478 -13.000  709.07000  7.31 3661
5 2010-06-30    3  61478  75.900  718.77000  7.41 3661
6 2010-09-30    4  61478  10.900 1231.52400 12.67 3661
7 2004-03-31    3 319126   0.424    9.73455  1.05 3861
8 2004-06-30    4 319126   0.407   13.90650  1.50 3861
...
Run Code Online (Sandbox Code Playgroud)

我用来创建xts对象列表的代码是:

CQT<-by(CQ[c("datadate","ibq","cik","mkvaltq","prccq","sic","fqtr")],CQ$cik,function(x)
  {
   xts(x,order.by=x$datadate,frequency=4)
  }
)
CQT<-as.list(CQT)
Run Code Online (Sandbox Code Playgroud)

我不确定是否必须转换为列表,但我对列表感到满意.

这会创建以下数据结构,这对我来说是正确的:

> head(CQT)
$`20`
           datadate     ibq     cik …
Run Code Online (Sandbox Code Playgroud)

r lapply xts

3
推荐指数
1
解决办法
460
查看次数

标签 统计

r ×4

data.table ×2

lag ×1

lapply ×1

plm ×1

plyr ×1

subset ×1

xts ×1