【问题标题】:How to open this tsv with R?如何用 R 打开这个 tsv?
【发布时间】:2015-01-24 23:27:43
【问题描述】:

我想打开这个 tsv 文件:userid-timestamp-artid-artname-traid-traname.tsv (http://www.dtic.upf.edu/~ocelma/MusicRecommendationDataset/lastfm-1K.html)

我知道这个文件包含 19,150,868 行,但是当我用 R 读取这个文件时,我只获得了 835K 行。

setwd('C:/xxx/lastfm-dataset-1K.tar/lastfm-dataset-1K')

df <- read.table('userid-timestamp-artid-artname-traid-traname.tsv', header=F, sep='\t', fill=T, quote='')

有时有些列是空的,这就是我使用fill=T的原因。

我很确定问题出在特殊字符上。 提取的最后一行是:user_000033 2007-05-24T19:50:25Z ~8+ ŤÄ

我尝试了几个fileEncoding,但都不起作用。

编辑:

其他人对完全相同的文件也有同样的问题,但没有找到答案: read.table only reads the first 835873 rows

我终于用 Python 做到了,它可以工作:

import pandas as pd     
import csv
df = pd.read _csv('userid-timestamp-artid-artname-traid-traname.tsv', quoting=csv.QUOTE_NONE, header=None , sep='\t', na_values=[''],  error_bad_lines=False)

所以问题是:如何对 R 做同样的事情?为什么奇怪的字符会给 R 而不是 Python 带来问题?

【问题讨论】:

  • 我认为最好的办法可能是将数据存储在 SOLite 数据库中。 r.789695.n4.nabble.com/…
  • 我会推荐 fread 来自 data.table 包的数据大小
  • @mkemp6 fread不起作用,因为它无法处理缺少列的行:stackoverflow.com/questions/18597488/fill-option-for-fread
  • @Stephane 你有机会用 awk 或 python 进行预处理吗?
  • @mkemp6。是的,我是在 Python 中完成的,它可以工作(请参阅更新)。我真的不明白为什么奇怪的字符会给 R 而不是 Python 造成问题! ://

标签: r import tsv


【解决方案1】:

我认为 SQLite 是个好主意,这就是我实现它的方法

从外壳:

$ sqlite3 test.db

然后在sqlite中:

sqlite> create table test (userid text, timestamp text, artid text, artname text, traid text, traname text);
sqlite> .separator "\t"
sqlite> .import userid-timestamp-artid-artname-traid-traname.tsv test

然后回到 R:

R> library(RSQLite)
Loading required package: DBI
R> conn <- dbConnect(SQLite(), dbname='test.db')
R> df <- dbGetQuery(conn, "SELECT * FROM test")
R> nrow(df)
[1] 15121996

它不是 1900 万,但在困难的数据集上已经足够接近了

【讨论】:

  • 为什么我们没有这个解决方案的所有行?
  • 因为歌曲名称中可能有标签,R 或 SQLite 将其解释为新列的开始。您总是可以使用 vi 或 emacs 来编辑文件并手动添加您自己的字段分隔符。
猜你喜欢
  • 1970-01-01
  • 2020-06-19
  • 2021-03-03
  • 1970-01-01
  • 2013-07-15
  • 2017-02-04
  • 1970-01-01
  • 2014-01-28
  • 2016-12-01
相关资源
最近更新 更多