读取文本文件:read.table 与 read_table
Reading text file: read.table versus read_table
我正在将 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
导入数据以保留完整的 Month 编码。
dim(temp_df1)
[1] 7963 4
dim(temp_df2)
[1] 7963 4
由于 by 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_fwf
,col_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()))
我正在将 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
导入数据以保留完整的 Month 编码。
dim(temp_df1)
[1] 7963 4
dim(temp_df2)
[1] 7963 4
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_fwf
,col_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()))