【问题标题】:download files in R while maintaining original structure [duplicate]在保持原始结构的同时下载R中的文件[重复]
【发布时间】:2017-02-15 12:28:26
【问题描述】:

下面的代码示例是从 census.gov 网站按州下载人口普查数据。我遇到的问题是,当我下载为 csv 文件时,前导零被删除。下载时如何保持文件的原始结构?

  stateFIPScodes<-seq(10,13,1)

  for(i in 1:length(stateFIPScodes)){
      URL<-paste("https://www.census.gov/popest/data/intercensal/county/files/CO-EST00INT-  ALLDATA-",stateFIPScodes[i],".csv",sep="" )
      destfile<-paste("state2000_2010_",stateFIPScodes[i],".csv" ,sep="") # CSV files drop leading zero!!
      download.file(URL, destfile)
 }

谢谢!

【问题讨论】:

  • 您是使用 Excel 还是文本编辑器查看数据? Excel 倾向于通过将值视为数字而不是字符串来删除零。如果您使用纯文本编辑器打开文件并且那里有零,则表明您的代码没问题,您只需要欺骗 Excel。
  • @JorganPubshire 谢谢。我将文件转换为文本文档而不是 Excel 下载,这似乎保持了原始结构。

标签: r download


【解决方案1】:

看起来好像文件已正确下载,但您是对的:如果您使用read.csv 将数据加载到R 中,那么某些列会被解释为numeric,因此它们会丢失前导零。

获取下载文件的代码 -

stateFIPScodes<-seq(10,13,1)

for(i in seq_along(stateFIPScodes)){
  code <- stateFIPScodes[[i]]
  URL <- paste0("https://www.census.gov/popest/data/intercensal/county/files/CO-EST00INT-ALLDATA-", code, ".csv")
  destfile <- paste0("state2000_2010_",code,".csv") 
  download.file(URL, destfile)
}

如果我们使用基数 read.csv,我们不会得到尾随零:

library(dplyr)

read.csv("state2000_2010_10.csv") %>%
  select(1:5) %>%
  head

#>   SUMLEV STATE COUNTY   STNAME     CTYNAME
#> 1     50    10      1 Delaware Kent County
#> 2     50    10      1 Delaware Kent County
#> 3     50    10      1 Delaware Kent County
#> 4     50    10      1 Delaware Kent County
#> 5     50    10      1 Delaware Kent County
#> 6     50    10      1 Delaware Kent County

这是因为前几列是作为数字读入的。

read.csv("state2000_2010_10.csv") %>% str()
#> 'data.frame':    780 obs. of  50 variables:
#>  $ SUMLEV      : int  50 50 50 50 50 50 50 50 50 50 ...
#>  $ STATE       : int  10 10 10 10 10 10 10 10 10 10 ...
#>  $ COUNTY      : int  1 1 1 1 1 1 1 1 1 1 ...

有两种方法可以解决这个问题:

  1. 手动将数据类型传递给read.csv,或者通过添加colClasses = "character" 来阻止所有转换。
  2. 使用正确处理它的readr::read_csv

我们可以阻止自动强制:

read.csv("state2000_2010_10.csv", colClasses = "character") %>% str()
#> 'data.frame':    780 obs. of  50 variables:
#>  $ SUMLEV      : chr  "050" "050" "050" "050" ...
#>  $ STATE       : chr  "10" "10" "10" "10" ...
#>  $ COUNTY      : chr  "001" "001" "001" "001" ...
#>  $ STNAME      : chr  "Delaware" "Delaware" "Delaware" "Delaware" ...

您需要选择要转换为 as.numeric 的列。

或者您可以选择列,例如

read.csv("state2000_2010_10.csv", 
         colClasses = c(
           SUMLEV = "character",
           STATE = "numeric",
           COUNTY = "character"
         )) %>%
  select(1:5) %>%
  head

#>   SUMLEV STATE COUNTY   STNAME     CTYNAME
#> 1    050    10    001 Delaware Kent County
#> 2    050    10    001 Delaware Kent County
#> 3    050    10    001 Delaware Kent County
#> 4    050    10    001 Delaware Kent County
#> 5    050    10    001 Delaware Kent County
#> 6    050    10    001 Delaware Kent County

其次,您可以使用readr,它具有更智能的列类型推断:

#> read_csv("state2000_2010_10.csv") %>%
#>    select(1:5) %>%
#>    head
#> # A tibble: 6 × 5
#>   SUMLEV STATE COUNTY   STNAME     CTYNAME
#>    <chr> <int>  <chr>    <chr>       <chr>
#> 1    050    10    001 Delaware Kent County
#> 2    050    10    001 Delaware Kent County
#> 3    050    10    001 Delaware Kent County
#> 4    050    10    001 Delaware Kent County
#> 5    050    10    001 Delaware Kent County
#> 6    050    10    001 Delaware Kent County

【讨论】:

  • 对于可能只是......使用的答案似乎过于复杂:colClasses="character", stringsAsFactors=FALSE
猜你喜欢
  • 2023-02-26
  • 1970-01-01
  • 1970-01-01
  • 2018-11-01
  • 2022-10-15
  • 2020-12-11
  • 2021-03-13
  • 2020-05-25
  • 1970-01-01
相关资源
最近更新 更多