非电子表格式的数据导入和组织

Non-spreadsheet-esque Data Import and Organization

基本问题

我有表格的数据

doc
id 1
var1 A
var2 B
...
varStar 453
varStar 3432
varStar 32
...
varN 
doc
var1 A
var2 B
(And so on)

其中doc表示每个record/observation的开始,varI表示一个变量,varStar表示感兴趣的变量可能有多个条目.

我愿意

  1. 使用 R 导入数据(或 Python,但我在那里有点生疏)。

  2. 对于每条记录检索 idvarStar 的所有实例。

  3. 以某种方式存储它们以备后用,方便 manipulation/merger。例如,一个列表或二元(可能是稀疏的)矩阵(对于我的应用程序 varStar 是一个类别,所以重叠是可以预料的)。

看起来这应该很容易,但我只熟悉 csv/spreadsheet 数据,可能只是不知道 Google 的正确单词。例如,我不想创建整个 SQL 数据库等,因为我不需要整个数据库。当然,做一些精心组织然后挑选出选择的作品可能更容易。

上下文 - 我的应用程序

我想检索 U.S。专利 classes 通过 Google/USPTO Bulk Downloads. So id is the patent number while varStar is the patent class fsc. Then, I want to merge this with the NBER Patent data。我的申请主要取决于专利 class 指定。 NBER 数据虽然在很多方面都不错,但每项专利仅报告了一个 "main" class。这并不好,因为根据对数据和 Volodin (2010) 的一篇论文的随意阅读,专利通常被授予几个顶级 classes。

沃洛金,德米特里。 (2010) 《NBER专利数据技术分类问题 Relevant for Research in Inventor Mobility”,工作论文。udel.edu/~volodin/pat/draft.pdf.

假设 dat.txt 看起来像:

doc
id 1
var1 A
var2 B
...
varStar 453
varStar 3432
varStar 32
...
varN
doc
id 2
var1 A
var2 B
varStar 111
varStar 222
varStar 333333
...

那么这是一个可能的框架:

library(dplyr)

dat <- readLines("dat.txt")

doc_starts <- which(grepl("^doc", dat))
doc_ends <- lead(doc_starts)-1
doc_ends[length(doc_ends)] <- length(dat)

# list-ified

lapply(seq_along(doc_starts), function(i) {

  chunk <- dat[doc_starts[i]:doc_ends[i]]

  id <- gsub("^id\ +", "", chunk[which(grepl("^id", chunk))])
  varStars <- gsub("^varStar\ +", "", chunk[which(grepl("^varStar", chunk))])

  list(id=id, varStar=varStars)

})

## [[1]]
## [[1]]$id
## [1] "1"
## 
## [[1]]$varStar
## [1] "453"  "3432" "32"  
## 
## 
## [[2]]
## [[2]]$id
## [1] "2"
## 
## [[2]]$varStar
## [1] "111"    "222"    "333333"


# data.frame-d

bind_rows(lapply(seq_along(doc_starts), function(i) {

  chunk <- dat[doc_starts[i]:doc_ends[i]]

  id <- gsub("^id\ +", "", chunk[which(grepl("^id", chunk))])
  varStars <- gsub("^varStar\ +", "", chunk[which(grepl("^varStar", chunk))])

  data_frame(id=id, varStar=varStars)

}))

## Source: local data frame [6 x 2]
## 
##   id varStar
## 1  1     453
## 2  1    3432
## 3  1      32
## 4  2     111
## 5  2     222
## 6  2  333333