非电子表格式的数据导入和组织
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
表示感兴趣的变量可能有多个条目.
我愿意
使用 R 导入数据(或 Python,但我在那里有点生疏)。
对于每条记录检索 id
和 varStar
的所有实例。
以某种方式存储它们以备后用,方便 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
基本问题
我有表格的数据
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
表示感兴趣的变量可能有多个条目.
我愿意
使用 R 导入数据(或 Python,但我在那里有点生疏)。
对于每条记录检索
id
和varStar
的所有实例。以某种方式存储它们以备后用,方便 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