我正在尝试将一些数据加载到 R 中,采用以下格式(作为文本文件)
Name Country Age
John,Smith United Kingdom 20
Washington,George USA 50
Martin,Joseph Argentina 43
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是“列”用空格分隔,这样它们都排列得很好,但一行可能在值和接下来的 10 个空格之间有 5 个空格。因此,当我加载它时,read.delim我会得到一个一列 data.frame
"John,Smith United Kingdom 20"
Run Code Online (Sandbox Code Playgroud)
作为第一次观察等等。
有什么办法可以:
我的想法是用空格分割字符串,除非它需要在 2 到 x 个空格之间(例如,"United Kingdom"保持在一起并且不会变成"United" "" "Kingdom")。但我不知道这是否可能。
我试过了,strsplit(data.frame[,1], sep="\\s")但它返回一个字符串列表,如:
"John,Smith" "" "" "" "" "" "" "" "United" "" "Kingdom" "" ""...
Run Code Online (Sandbox Code Playgroud)
我不知道该怎么办。
拥有“整齐排列”的列是固定宽度数据的典型特征。
为了这个答案,我已将三行数据和一行标题信息写入名为“x”的临时文件。对于您的实际使用,请将“x”替换为文件名/路径,就像您通常使用read.delim.
这是示例数据:
x <- tempfile()
cat("Name Country Age\nJohn,Smith United Kingdom 20\nWashington,George USA 50\nMartin,Joseph Argentina 43\n", file = x)
Run Code Online (Sandbox Code Playgroud)
R 有自己的读取固定宽度数据的函数 ( read.fwf),但它的速度非常慢,并且您需要在开始之前知道宽度。如果文件很小,我们可以计算这些,然后使用类似:
read.fwf(x, c(22, 18, 4), strip.white = TRUE, skip = 1,
col.names = c("Name", "Country", "Age"))
# Name Country Age
# 1 John,Smith United Kingdom 20
# 2 Washington,George USA 50
# 3 Martin,Joseph Argentina 43
Run Code Online (Sandbox Code Playgroud)
或者,您可以让fwf_widths“readr”包为您猜测宽度,然后使用read_fwf:
library(readr)
read_fwf(x, fwf_empty(x, col_names = c("Name", "Country", "Age")), skip = 1)
# Name Country Age
# 1 John,Smith United Kingdom 20
# 2 Washington,George USA 50
# 3 Martin,Joseph Argentina 43
Run Code Online (Sandbox Code Playgroud)