【发布时间】:2018-09-24 13:00:47
【问题描述】:
在我的研究中,我经常遇到列表中列表的问题。今天,我再次遇到了一个我不知道如何在 R 中最好地解决的程序。我尝试使用 data.table 解决问题,但遇到了麻烦。
我有各种初创公司的数据,比如Startup1、Startup2 等。对于每家初创公司,我都有投资者信息,VC1、VC2 等。我也有关于初创公司何时开始活动的信息:StartYr 和以投资者为特征的融资轮次VCNam,这一年是一轮融资发生FRYr,收到的金额FMoney。对于每个 Startup,融资轮次的数量都会发生变化,投资者的数量也会发生变化。
作为第一个练习,我尝试计算StartYr 和给定资助年份之间的时间。这是我的代码:
library(data.table)
dtF1=data.table(VCNam=c("VC1","VC2"),FRYr=c("2006","2007"),FMoney=c(10000,20000))
dtF2=data.table(VCNam=c("VC1","VC3","VC4"),FRYr=c("2010","2011","2012"),FMoney=c(10,20,30))
dt=data.table(FirmName=c("Startup1","Startup2"),StartYr=c("2001","2005"),FdRounds=c(dtF1,dtF2))
dt[]
FNams=unique(dt$FirmName)
for (nam in FNams){
print(paste("dealing with firm",nam))
dtSub=dt[FirmName==nam,.(StartYr,FdRounds)]
StartYr=as.integer(dtSub[,StartYr])
print(StartYr)
print(dtSub[,FdRounds][[1]])
print(dtSub[,FdRounds][[2]])
FRYr=dtSub[,FdRounds][[3]]
print(as.integer(FRYr)-StartYr)
}
这是我的输出:
> dt[]
FirmName StartYr FdRounds
1: Startup1 2001 VC1,VC2
2: Startup2 2005 2006,2007
3: Startup1 2001 10000,20000
4: Startup2 2005 VC1,VC3,VC4
5: Startup1 2001 2010,2011,2012
6: Startup2 2005 10,20,30
and:
[1] "dealing with firm Startup1"
[1] 2001 2001 2001
[1] "VC1" "VC2"
[1] 10000 20000
[1] 9 10 11 # the right answer
[1] "dealing with firm Startup2"
[1] 2005 2005 2005
[1] "2006" "2007"
[1] "VC1" "VC3" "VC4"
[1] -1995 -1985 -1975 # a crazy answer.
Startup1 的结果 9 10 11 是正确的,但 Startup2 的结果是 -1995 等。检查发现 dt 不再包含正确的元素顺序:VC 名称、资助年份、资金。
问题 1:我愿意使用列表、dplyr 或 data.table,这是解决此问题的建议方法。数据是数百家公司,所以时间是个问题。
问题 2:如何解决这个代表我一直遇到的问题的问题?相关:有没有更函数化的编程方式来处理这个问题?
【问题讨论】:
-
感谢您提出的问题以及对样本数据的详细解释。
标签: r dplyr data.table