我可以使用read.csv或read.csv2将数据读入R.但我遇到的问题是我的分隔符是一个多字节字符串而不是一个字符。我怎么处理这个?
答案 0 :(得分:9)
提供示例数据会有所帮助。但是,您可以根据自己的需要调整以下内容。
我创建了一个示例数据文件,它只是一个包含以下内容的文本文件:
1sep2sep3
1sep2sep3
1sep2sep3
1sep2sep3
1sep2sep3
1sep2sep3
1sep2sep3
我把它保存为'test.csv'。分隔字符是'sep'字符串。我认为read.csv()
使用scan()
,只接受sep
的单个字符。要解决它,请考虑以下事项:
dat <- readLines('test.csv')
dat <- gsub("sep", " ", dat)
dat <- textConnection(dat)
dat <- read.table(dat)
readLines()
只读取。gsub
替换单个' '
的多字符分隔字符串,或任何方便您的数据。然后textConnection()
和read.data()
方便地读取所有内容。对于较小的数据集,这应该没问题。如果您有非常大的数据,请考虑使用类似AWK的预处理来替换多字符分隔字符串。以上内容来自http://tolstoy.newcastle.edu.au/R/e4/help/08/04/9296.html。
的更新强> 的
关于您的评论,如果您的数据中有空格,请使用其他替换分隔符。考虑将test.csv
更改为:
1sep2 2sep3
1sep2 2sep3
1sep2 2sep3
1sep2 2sep3
1sep2 2sep3
1sep2 2sep3
1sep2 2sep3
然后,使用以下功能:
readMulti <- function(x, sep, replace, as.is = T)
{
dat <- readLines(x)
dat <- gsub(sep, replace, dat)
dat <- textConnection(dat)
dat <- read.table(dat, sep = replace, as.is = as.is)
return(dat)
}
尝试:
readMulti('test.csv', sep = "sep", replace = "\t", as.is = T)
在这里,您使用制表符(\t
)替换原始分隔符。 as.is
传递给read.table()
以防止读入字符串是因素,但这是您的通话。如果您的数据中有更复杂的空格,您可能会发现quote
中的read.table()
参数有用,或者使用AWK,perl等进行预处理。
与crippledlambda strsplit()
类似的东西很可能与中等大小的数据相同。如果性能成为问题,请尝试两者并查看哪些适合您。
答案 1 :(得分:4)
在这种情况下,您可以将textConnection(txt)
替换为您的文件名,但基本上您可以围绕strsplit
构建代码或函数。这里我假设你有一个标题行,但你当然可以定义一个header
参数,并根据下面的函数推广数据框的创建:
read.multisep <- function(File,sep) {
Lines <- readLines(File)
Matrix <- do.call(rbind,strsplit(Lines, sep, fixed = TRUE))
DataFrame <- structure(data.frame(Matrix[-1,]), names=Matrix[1,]) ## assuming header is present
DataFrame[] <- lapply(DataFrame, type.convert) ## automatically convert modes
DataFrame
}
example <- "a#*&b#*&c
1#*&2#*&3
4#*&5#*&6"
read.multisep(textConnection(example),sep="#*&")
a b c
1 1 2 3
2 4 5 6