阅读文本文件:read.table与read_table

时间:2016-10-28 14:15:04

标签: r import read.table readr tidyverse

我正在将this webpage中的文本文件读入R.如果我使用read.table读取此数据,数据会被正确解析并获得所有12个月的数据:

url <- "http://academic.udayton.edu/kissock/http/Weather/gsod95-current/OHCINCIN.txt"

temp_df1 <- read.table(url,
                       col.names = c("Month", "Day", "Year", "Avg_Temp"),
                       na = "-99")

head(temp_df1)
Month Day Year Avg_Temp
1     1   1 1995     41.1
2     1   2 1995     22.2
3     1   3 1995     22.8
4     1   4 1995     14.9
5     1   5 1995      9.5
6     1   6 1995     23.8

unique(temp_df1$Month)
[1]  1  2  3  4  5  6  7  8  9 10 11 12

但是,如果我使用read_table读取此数据,则首先会显示它已正确解析;但是,正在剥离双位数月份代码(10,11,12),以便只解析第一个数字。

temp_df2 <- read_table(url,
                       col_names = c("Month", "Day", "Year", "Avg_Temp"),
                       na = "-99")

head(temp_df2)
# A tibble: 6 × 4
  Month   Day  Year Avg_Temp
  <int> <int> <int>    <dbl>
1     1     1  1995     41.1
2     1     2  1995     22.2
3     1     3  1995     22.8
4     1     4  1995     14.9
5     1     5  1995      9.5
6     1     6  1995     23.8

unique(temp_df2$Month)
[1] 1 2 3 4 5 6 7 8 9

数据的尺寸相同;但是,我无法弄清楚如何使用read_table导入数据以保留完整的编码。

dim(temp_df1)
[1] 7963    4

dim(temp_df2)
[1] 7963    4

1 个答案:

答案 0 :(得分:2)

由于comments LukeA中提到的问题,

read_table无法按预期工作。相反,您应该使用read_fwf函数并指定字段长度以避免此问题。

temp_df2 <- read_fwf(url, 
    col_positions = fwf_widths(c(14, 14, 13, 4), col_names = c("Month", "Day", "Year", "Avg_Temp")))

请注意,对于read_fwfcol_names会作为参数传递给fwf_widths,而不会传递给read_fwf本身。

此外,使用read_fwf,您甚至可以跳过一个步骤,并在阅读时将日期解析为Date对象:

temp_df2 <- read_fwf(url,
                  col_positions = fwf_widths(c(41, 4),
                                             col_names = c("date", "Avg_Temp")), 
                  col_types = cols(col_date("%m %d %Y"), col_number()))