将字符串拆分多个空格

时间:2016-03-14 04:15:13

标签: r

我正在尝试将一些数据加载到R中,格式如下(作为文本文件)

func doLogin() {

        let successVC = self.storyboard?.instantiateViewControllerWithIdentifier("LoginSucessViewController") as! LoginSucessViewController
        successVC.currentUser = user
        self.presentViewController(successVC, animated: true, completion: nil)
}

我遇到的问题是“列”由空格分隔,以便它们排列得很好,但是一行可能在值和接下来的10个空格之间有5个空格。因此,当我使用Name Country Age John,Smith United Kingdom 20 Washington,George USA 50 Martin,Joseph Argentina 43 加载它时,我得到一个带有

的列data.frame
read.delim

作为第一次观察等等。

我有什么方法可以:

  1. 将数据加载到R中为可用格式?或
  2. 将字符串以一列格式加载后,将它们分成单独的列?
  3. 我的想法是用空格分割字符串,除了它需要在2和x空格之间(例如,"John,Smith United Kingdom 20" 保持在一起而不会变成"United Kingdom")。但我不知道这是否可行。

    我尝试了"United" "" "Kingdom",但它返回了一个字符串列表,如:

    strsplit(data.frame[,1], sep="\\s")

    我不知道该怎么做。

2 个答案:

答案 0 :(得分:3)

具有所有“排列良好”的列是固定宽度数据的典型特征。

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

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

或者,你可以让“readr”包中的fwf_widths为你做宽度猜测,然后使用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

答案 1 :(得分:1)

您可以执行基座R,假设您的列不包含多于1个空格的字词:

txt = "Name                  Country            Age
John,Smith            United Kingdom     20
Washington,George     USA                50
Martin,Joseph         Argentina          43"

conn = textConnection(txt)
do.call(rbind, lapply(readLines(conn), function(u) strsplit(u,'\\s{2,}')[[1]]))
#     [,1]                [,2]             [,3] 
#[1,] "Name"              "Country"        "Age"
#[2,] "John,Smith"        "United Kingdom" "20" 
#[3,] "Washington,George" "USA"            "50" 
#[4,] "Martin,Joseph"     "Argentina"      "43"