首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >导入.tsv文件

导入.tsv文件
EN

Stack Overflow用户
提问于 2017-06-10 01:29:21
回答 2查看 4.8K关注 0票数 0

我在R中导入一个.tsv文件时遇到了问题,该数据文件来自Eurostats,并且是可公开使用的:IMM10CTB

我使用以下代码导入它:

代码语言:javascript
复制
immig <- read.table(file="immig.tsv", sep="\t", header=TRUE)

但是,代码似乎不起作用。我没有收到任何错误消息,但是输出如下所示:

代码语言:javascript
复制
> immig[1:3, 1:3]
   age.agedef.c_birth.unit.sex.geo.time X2015 X2014
1 TOTAL,COMPLET,CC5_13_FOR_X_IS,NR,F,AT 4723  4093 
2 TOTAL,COMPLET,CC5_13_FOR_X_IS,NR,F,BE 1017   953 
3 TOTAL,COMPLET,CC5_13_FOR_X_IS,NR,F,BG  559   577 

我做错了什么?我试着用sep=","代替,但它似乎解决了一些问题,而另一些问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-06-10 02:03:04

你错过了2013年的数据是个问题吗?

我下载了该链接中的文件,使用命令行工具解压缩它,然后可以使用readr库很好地导入它:

代码语言:javascript
复制
library(readr)

immigration <- read_tsv("~/Downloads/migr_imm10ctb.tsv", na = ":")
#> Parsed with column specification:
#> cols(
#>   `age,agedef,c_birth,unit,sex,geo\time` = col_character(),
#>   `2015` = col_character(),
#>   `2014` = col_character(),
#>   `2013` = col_character()
#> )

immigration
#> # A tibble: 45,558 x 4
#>    `age,agedef,c_birth,unit,sex,geo\\time` `2015` `2014` `2013`
#>                                      <chr>  <chr>  <chr>  <chr>
#>  1   TOTAL,COMPLET,CC5_13_FOR_X_IS,NR,F,AT   4723   4093   4085
#>  2   TOTAL,COMPLET,CC5_13_FOR_X_IS,NR,F,BE   1017    953   1035
#>  3   TOTAL,COMPLET,CC5_13_FOR_X_IS,NR,F,BG    559    577  743 p
#>  4   TOTAL,COMPLET,CC5_13_FOR_X_IS,NR,F,CH   2876   2766   2758
#>  5   TOTAL,COMPLET,CC5_13_FOR_X_IS,NR,F,CY   <NA>   <NA>     54
#>  6   TOTAL,COMPLET,CC5_13_FOR_X_IS,NR,F,CZ    120    106    155
#>  7   TOTAL,COMPLET,CC5_13_FOR_X_IS,NR,F,DE   <NA>   <NA>  14984
#>  8   TOTAL,COMPLET,CC5_13_FOR_X_IS,NR,F,DK    372    365    405
#>  9   TOTAL,COMPLET,CC5_13_FOR_X_IS,NR,F,EE     23      7     16
#> 10   TOTAL,COMPLET,CC5_13_FOR_X_IS,NR,F,EL   <NA>   <NA>    234
#> # ... with 45,548 more rows

似乎有一些多余的字符(743 p)在其中只应该有数字,所以您需要做更多的清理,然后转换为数字。

代码语言:javascript
复制
library(dplyr)
library(stringr)

immigration %>%
    mutate_at(vars(`2015`:`2013`), str_extract, pattern = "[0-9]+") %>%
    mutate_at(vars(`2015`:`2013`), as.numeric)
#> # A tibble: 45,558 x 4
#>    `age,agedef,c_birth,unit,sex,geo\\time` `2015` `2014` `2013`
#>                                      <chr>  <dbl>  <dbl>  <dbl>
#>  1   TOTAL,COMPLET,CC5_13_FOR_X_IS,NR,F,AT   4723   4093   4085
#>  2   TOTAL,COMPLET,CC5_13_FOR_X_IS,NR,F,BE   1017    953   1035
#>  3   TOTAL,COMPLET,CC5_13_FOR_X_IS,NR,F,BG    559    577    743
#>  4   TOTAL,COMPLET,CC5_13_FOR_X_IS,NR,F,CH   2876   2766   2758
#>  5   TOTAL,COMPLET,CC5_13_FOR_X_IS,NR,F,CY     NA     NA     54
#>  6   TOTAL,COMPLET,CC5_13_FOR_X_IS,NR,F,CZ    120    106    155
#>  7   TOTAL,COMPLET,CC5_13_FOR_X_IS,NR,F,DE     NA     NA  14984
#>  8   TOTAL,COMPLET,CC5_13_FOR_X_IS,NR,F,DK    372    365    405
#>  9   TOTAL,COMPLET,CC5_13_FOR_X_IS,NR,F,EE     23      7     16
#> 10   TOTAL,COMPLET,CC5_13_FOR_X_IS,NR,F,EL     NA     NA    234
#> # ... with 45,548 more rows

它是一个由制表符分隔的文件,但是第一列都是用逗号放在一起的,所以如果您想要的是分离出的信息,可以用tidyr::separate()来完成。

代码语言:javascript
复制
library(tidyr)

immigration %>%
    separate(`age,agedef,c_birth,unit,sex,geo\\time`,
             c("age", "agedef", "c_birth", "unit", "sex", "geo"),
             sep = ",")
#> # A tibble: 45,558 x 9
#>      age  agedef         c_birth  unit   sex   geo `2015` `2014` `2013`
#>  * <chr>   <chr>           <chr> <chr> <chr> <chr>  <chr>  <chr>  <chr>
#>  1 TOTAL COMPLET CC5_13_FOR_X_IS    NR     F    AT   4723   4093   4085
#>  2 TOTAL COMPLET CC5_13_FOR_X_IS    NR     F    BE   1017    953   1035
#>  3 TOTAL COMPLET CC5_13_FOR_X_IS    NR     F    BG    559    577  743 p
#>  4 TOTAL COMPLET CC5_13_FOR_X_IS    NR     F    CH   2876   2766   2758
#>  5 TOTAL COMPLET CC5_13_FOR_X_IS    NR     F    CY   <NA>   <NA>     54
#>  6 TOTAL COMPLET CC5_13_FOR_X_IS    NR     F    CZ    120    106    155
#>  7 TOTAL COMPLET CC5_13_FOR_X_IS    NR     F    DE   <NA>   <NA>  14984
#>  8 TOTAL COMPLET CC5_13_FOR_X_IS    NR     F    DK    372    365    405
#>  9 TOTAL COMPLET CC5_13_FOR_X_IS    NR     F    EE     23      7     16
#> 10 TOTAL COMPLET CC5_13_FOR_X_IS    NR     F    EL   <NA>   <NA>    234
#> # ... with 45,548 more rows
票数 2
EN

Stack Overflow用户

发布于 2017-06-10 02:01:59

像这样的事情可能是一个起点:

代码语言:javascript
复制
link <- "http://ec.europa.eu/eurostat/estat-navtree-portlet-prod/BulkDownloadListing?file=data/migr_imm10ctb.tsv.gz"

data <- readr::read_csv(link) %>% 
       separate("geo\\time\t2015 \t2014 \t2013", into = c("geo", "2015", "2014", "2013"), sep = "\t")
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44468662

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档