使用 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中尝试
  1. 正在使用 readLines
  2. 读取文件
  3. 使用 grep
  4. 创建一个包含 pastesubset 行的模式
  5. split "lines1" 到 list 中,列表元素是每个 prefix 组。在 split 之前,我使用 sub.
  6. 删除了 :LHSRHS
  7. cbind 列表元素使用 do.call(cbind 并将其转换为 data.frame
  8. 这将 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