将一个字符串拆分多个空格

mom*_*822 5 r

我正在尝试将一些数据加载到 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)

作为第一次观察等等。

有什么办法可以:

  1. 将数据加载到 R 中为可用格式?或者
  2. 一旦我以一列格式加载字符串,将字符串拆分为单独的列?

我的想法是用空格分割字符串,除非它需要在 2 到 x 个空格之间(例如,"United Kingdom"保持在一起并且不会变成"United" "" "Kingdom")。但我不知道这是否可能。

我试过了,strsplit(data.frame[,1], sep="\\s")但它返回一个字符串列表,如:

"John,Smith" "" "" "" "" "" "" "" "United" "" "Kingdom" "" ""...
Run Code Online (Sandbox Code Playgroud)

我不知道该怎么办。

A5C*_*2T1 4

拥有“整齐排列”的列是固定宽度数据的典型特征。

为了这个答案,我已将三行数据和一行标题信息写入名为“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)