私は、以下の2つの機能が、あなたが望む/必要とすることができると信じています。
最初に、2行目の空白を含むファイルを特定する機能。
second_blank <- function(path = ".", pattern = "\\.csv"){
fls <- list.files(path = path, pattern = pattern)
second <- sapply(fls, function(f) readLines(f, n = 2)[2])
which(nchar(gsub(",", "", second)) == 0)
}
次に、このような行を含むファイルを1つずつ読み込む機能。最初の行は列ヘッダーであり、少なくとも2行目は空白のままであることを前提としています。他の引数をread.table
に渡すためには、ドットの引数...
があります(stringsAsFactors = FALSE
など)。
skip_blank <- function(file, ...){
header <- readLines(file, n = 1)
header <- strsplit(header, ",")[[1]]
count <- 1L
while(TRUE){
txt <- scan(file, what = "character", skip = count, nlines = 1)
if(nchar(gsub(",", "", txt)) > 0) break
count <- count + 1L
}
dat <- read.table(file, skip = count, header = TRUE, sep = ",", dec = ".", fill = TRUE, ...)
names(dat) <- header
dat
}
ここでは、使用例を示します。
second_blank(pattern = "csv") # a first run as an example usage
inx <- second_blank() # this will be needed later
fl_names <- list.files(pattern = "\\.csv") # get all the CSV files
df_list <- lapply(fl_names[inx], skip_blank) # read the problem ones
names(df_list) <- fl_names[inx] # tidy up the result list
df_list
これまでに何を試みましたか? [良い質問をする方法](http://stackoverflow.com/help/how-to-ask)と[再現可能な例を与える方法](http://stackoverflow.com/questions/)の情報をお読みください。 5963269/how-to-make-a-great-r-reproducible-example/5963610を参照)。これは他の人があなたを助けることをはるかに容易にします。 – Jaap
各ファイルを 'read.csv'で読み込むのではなく、' readLines'を使って、例えば10行を読み込み、何行目に空白行があるのかを数え、 'read.csv'を使って適切な行数。 –
@AndrewGustarさんのコメントを見ました。これは、以下のコードが行うことです。 –