【问题标题】:Error when reading Wikipedia’s data with R and readr使用 R 和 readr 读取 Wikipedia 数据时出错
【发布时间】:2017-11-03 19:20:12
【问题描述】:

我是 R 编程新手。我在 mac OS X El Capitan V10.11.6 中使用 R 3.4.2。

当我尝试从以下 url 读取数据时,出现错误。

数据源链接: https://dumps.wikimedia.org/other/pageviews/2017/2017-10/pageviews-20171001-010000.gz

该文件包含四个字段:语言、维基百科页面标题、页面在这一小时内收到的请求数、返回内容的总大小(以字节为单位)。它是由空格分隔的 csv 文件,没有标题行。

我尝试使用以下代码读取表格:

df <- read.table("https://dumps.wikimedia.org/other/pageviews/2017/2017-10/pageviews-20171001-010000.gz", sep = " ", stringsAsFactors = FALSE, header = FALSE, encoding = "UTF-8")

我得到的错误是

扫描错误(文件 = 文件,什么 = 什么,sep = sep,quote = quote,dec = dec,: 第 1 行没有 2 个元素 另外:警告信息: 在 read.table("https://dumps.wikimedia.org/other/pageviews/2017/2017-10/pageviews-20171001-010000.gz", : 第 1 行似乎包含嵌入的空值

我也尝试使用 readr 包,仍然失败。我使用的代码如下

df <- read_delim("https://dumps.wikimedia.org/other/pageviews/2017/2017-10/pageviews-20171001-010000.gz", delim = " ", col_names = FALSE)

顺便说一句,当我用 spark scala 读取这些数据时,没有问题。

【问题讨论】:

  • 添加devtools::session_info() 的输出可能有助于对根本原因进行分类

标签: r


【解决方案1】:
library(stringi)
library(tidyverse)

gzfile("pageviews-20171001-010000.gz") %>% 
  readLines(skipNul=TRUE) %>% 
  stri_split_fixed(" ", simplify=TRUE) %>% 
  as_data_frame() -> xmat

xmat

## # A tibble: 4,598,475 x 4
##       V1                                V2    V3    V4
##    <chr>                             <chr> <chr> <chr>
##  1    aa                 Category:Articles     1     0
##  2    aa                  Category:User_aa     1     0
##  3    aa        File:Wikipedia-logo-en.png     2     0
##  4    aa                         Main_Page    35     0
##  5    aa               Special:ActiveUsers     6     0
##  6    aa Special:Contributions/Lars~aawiki     1     0
##  7    aa    Special:Contributions/PipepBot     1     0
##  8    aa                 Special:ListFiles     3     0
##  9    aa                 Special:ListUsers     3     0
## 10    aa                Special:Statistics    10     0
## # ... with 4,598,465 more rows

【讨论】:

  • 谢谢,@hrbrmstr。只是想知道为什么 read.table 和 read_delim 不起作用。你能帮忙吗?
  • b/c 确实存在嵌入的空值,并且 spark 的底层 scala/java 可能更宽容。 read_delim("pageviews-20171001-010000.gz", delim=" ", col_names=FALSE, locale=locale(encoding="UTF-8")) 也可以
  • 我尝试使用 read_delim 添加语言环境。我仍然有 4,421,548 行而不是 4,598,475
【解决方案2】:

在我的情况下有效。它可能依赖于系统/包版本吗?

library(readr)

df <- read_delim("https://dumps.wikimedia.org/other/pageviews/2017/2017-10/pageviews-20171001-010000.gz", 
                 delim = " ", col_names = FALSE)
df
# A tibble: 4,421,548 x 4
##X1                                X2    X3    X4
##<chr>                             <chr> <int> <int>
##1    aa                 Category:Articles     1     0
##2    aa                  Category:User_aa     1     0
##3    aa        File:Wikipedia-logo-en.png     2     0
##4    aa                         Main_Page    35     0
##5    aa               Special:ActiveUsers     6     0
##6    aa Special:Contributions/Lars~aawiki     1     0
##7    aa    Special:Contributions/PipepBot     1     0
##8    aa                 Special:ListFiles     3     0
##9    aa                 Special:ListUsers     3     0
##10    aa                Special:Statistics    10     0
# ... with 4,421,538 more rows
sessionInfo()
##R version 3.4.2 (2017-09-28)
##Platform: x86_64-pc-linux-gnu (64-bit)
##Running under: Ubuntu 17.10
##
##Matrix products: default
##BLAS: /usr/lib/x86_64-linux-gnu/openblas/libblas.so.3
##LAPACK: /usr/lib/x86_64-linux-gnu/libopenblasp-r0.2.20.so
##
##locale:
##[1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
##[3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
##[5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8   
##[7] LC_PAPER=en_US.UTF-8       LC_NAME=C                 
##[9] LC_ADDRESS=C               LC_TELEPHONE=C            
##[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       
##
##attached base packages:
##[1] stats     graphics  grDevices utils     datasets  methods   base   

【讨论】:

  • 它在我的 macOS 上的表现不同。即使read_delim("pageviews-20171001-010000.gz", delim=" ", col_names=FALSE, locale=locale(encoding="UTF-8")) 也会抛出大量警告
  • 是的,Ubuntu下也有警告。
  • 有了这个,你得到了 4,421,548 个结果,但实际上应该是 4,598,475。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-27
  • 1970-01-01
  • 2018-06-09
  • 1970-01-01
  • 2018-12-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多