使用 R 或 Python 对数据进行子集化
Subsetting data using R or Python
我想对以下数据集进行子集化。具体来说,我只想以 "csv" 格式检索 1)ID、2)ASIN、3) Group、4) salesrank 和 5) 类别。我将使用 R 或 Python。
(R 不能频繁读取这种不规则的数据格式)。
以下数据没有通常的格式,所以我不知道如何对其进行子集化。我有两年
有 R 方面的经验,但主要是将该工具用于统计目的。所以,我不习惯用不寻常的格式处理这种数据操作。如果有人能给我答案(或线索),那就太好了。
底部是一组由"key:value"组成的数据。最终结果应该是这样的
这个:
Id ASIN group salesrank categories
1 0827229534 Book 396585 2
原始数据如下:
************************************************************************************************
Id: 1
ASIN: 0827229534
title: Patterns of Preaching: A Sermon Sampler
group: Book
salesrank: 396585
similar: 5 0804215715 156101074X 0687023955 0687074231 082721619X
categories: 2
|Books[283155]|Subjects[1000]|Religion & Spirituality[22]|Christianity[12290]|Clergy[12360]|Preaching[12368]
|Books[283155]|Subjects[1000]|Religion & Spirituality[22]|Christianity[12290]|Clergy[12360]|Sermons[12370]
reviews: total: 2 downloaded: 2 avg rating: 5
2000-7-28 cutomer: A2JW67OY8U6HHK rating: 5 votes: 10 helpful: 9
2003-12-14 cutomer: A2VE83MZF98ITY rating: 5 votes: 6 helpful: 5
您可以通过
在R
中尝试
- 正在使用
readLines
读取文件
- 使用
grep
创建一个包含 paste
到 subset
行的模式
split
"lines1" 到 list
中,列表元素是每个 prefix
组。在 split
之前,我使用 sub
. 删除了 :
的 LHS
和 RHS
cbind
列表元素使用 do.call(cbind
并将其转换为 data.frame
- 这将 return 列 class
character
。不清楚应该是哪一个character/numeric
注意:我创建了两条记录只是为了重现该问题。
lines <- readLines('file.txt')
pat <- paste0(c('Id', 'ASIN', 'group', 'salesrank', 'categories'),
':', collapse='|')
lines1 <- lines[grep(pat, lines)]
val <- str_trim(sub(".*:", "", lines1))
Grp <- sub(":.*", '', lines1)
library(stringr)
res <- do.call(cbind,split(val,Grp))
res1 <- as.data.frame(res,stringsAsFactors=FALSE)
res1
# ASIN categories group Id salesrank
#1 0827229534 2 Book 1 396585
#2 0827529534 3 Book2 2 396587
我想对以下数据集进行子集化。具体来说,我只想以 "csv" 格式检索 1)ID、2)ASIN、3) Group、4) salesrank 和 5) 类别。我将使用 R 或 Python。 (R 不能频繁读取这种不规则的数据格式)。
以下数据没有通常的格式,所以我不知道如何对其进行子集化。我有两年 有 R 方面的经验,但主要是将该工具用于统计目的。所以,我不习惯用不寻常的格式处理这种数据操作。如果有人能给我答案(或线索),那就太好了。 底部是一组由"key:value"组成的数据。最终结果应该是这样的 这个:
Id ASIN group salesrank categories
1 0827229534 Book 396585 2
原始数据如下:
************************************************************************************************
Id: 1
ASIN: 0827229534
title: Patterns of Preaching: A Sermon Sampler
group: Book
salesrank: 396585
similar: 5 0804215715 156101074X 0687023955 0687074231 082721619X
categories: 2
|Books[283155]|Subjects[1000]|Religion & Spirituality[22]|Christianity[12290]|Clergy[12360]|Preaching[12368]
|Books[283155]|Subjects[1000]|Religion & Spirituality[22]|Christianity[12290]|Clergy[12360]|Sermons[12370]
reviews: total: 2 downloaded: 2 avg rating: 5
2000-7-28 cutomer: A2JW67OY8U6HHK rating: 5 votes: 10 helpful: 9
2003-12-14 cutomer: A2VE83MZF98ITY rating: 5 votes: 6 helpful: 5
您可以通过
在R
中尝试
- 正在使用
readLines
读取文件
- 使用
grep
创建一个包含 split
"lines1" 到list
中,列表元素是每个prefix
组。在split
之前,我使用sub
. 删除了 cbind
列表元素使用do.call(cbind
并将其转换为data.frame
- 这将 return 列 class
character
。不清楚应该是哪一个character/numeric
paste
到 subset
行的模式
:
的 LHS
和 RHS
注意:我创建了两条记录只是为了重现该问题。
lines <- readLines('file.txt')
pat <- paste0(c('Id', 'ASIN', 'group', 'salesrank', 'categories'),
':', collapse='|')
lines1 <- lines[grep(pat, lines)]
val <- str_trim(sub(".*:", "", lines1))
Grp <- sub(":.*", '', lines1)
library(stringr)
res <- do.call(cbind,split(val,Grp))
res1 <- as.data.frame(res,stringsAsFactors=FALSE)
res1
# ASIN categories group Id salesrank
#1 0827229534 2 Book 1 396585
#2 0827529534 3 Book2 2 396587