我正在尝试将一些数据加载到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
加载它时,我得到一个带有
read.delim
作为第一次观察等等。
我有什么方法可以:
我的想法是用空格分割字符串,除了它需要在2和x空格之间(例如,"John,Smith United Kingdom 20"
保持在一起而不会变成"United Kingdom"
)。但我不知道这是否可行。
我尝试了"United" "" "Kingdom"
,但它返回了一个字符串列表,如:
strsplit(data.frame[,1], sep="\\s")
我不知道该怎么做。
答案 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"