这是一个非常简单的问题,但我无法找到明确的答案,所以我想我会问它.我使用该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 …
我正在努力有效地在两个数据帧之间执行"关闭"日期匹配.这个问题探讨了idata.frame从plyr包中使用的解决方案,但我也非常满意其他建议的解决方案.
这是两个数据框的非常简单的版本:
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) 注意:这是我最初发布到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) 我在处理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)