在read.csv中跳过所有前导空行

7
我希望能将CSV文件导入R中,第一行非空行提供数据框列名。我知道可以使用skip = 0参数指定要读取的第一行。但是,第一行非空行的行号可能会因文件而异。
如何确定有多少行为空,并动态跳过每个文件的空行?
正如评论中指出的那样,我需要澄清“空白”是什么意思。我的CSV文件如下:
,,,
w,x,y,z
a,b,5,c
a,b,5,c
a,b,5,c
a,b,4,c
a,b,4,c
a,b,4,c

这意味着在开头有一行逗号。
3个回答

11

read.csv自动跳过空行(除非您设置blank.lines.skip=FALSE)。请参见?read.csv

在撰写上述内容后,发帖人解释说空行实际上并不是空白的,而是逗号之间没有任何东西。在这种情况下,请使用data.table包中的fread来处理。 skip=参数可以设置为标题中找到的任何字符字符串:

library(data.table)
DT <- fread("myfile.csv", skip = "w") # assuming w is in the header
DF <- as.data.frame(DT)

如果返回一个data.table作为返回值,最后一行可以省略。


1
很好的发现。只要“空”行完全没有任何字符,这应该可以正常工作。OP可能需要澄清他们数据的性质。 - thelatemail
我尝试使用 blank.lines.skip = TRUE,但不知道为什么它没有起作用。原来是因为空行中包含逗号。 - Alex
跳过空行会有任何性能上的缺失吗? - - 在我的尝试中,我每隔一行就留空一行,实际上是每个奇数行都是空白的。 - - 我喜欢尽可能保持数据原始性。 - Léo Léopold Hertz 준영

2

根据您的文件大小,这可能不是最好的解决方案,但可以完成工作。

策略是,不使用分隔符读取文件,而是按行读取,并计算字符数并存储到临时变量中。 然后,while循环将在列表中搜索第一个非零字符长度, 然后读取文件,并将其存储为data_filename。

flist = list.files()
for (onefile in flist) {
  temp = nchar(readLines(onefile))
  i = 1
  while (temp[i] == 0) {
    i = i + 1
  }
  temp = read.table(onefile, sep = ",", skip = (i-1))
  assign(paste0(data, onefile), temp)
}

如果文件包含标题行,你可以从2开始计数i。

2
如果前几行是真正的空行,那么read.csv应该会自动跳到第一行。如果这些行有逗号但没有值,则可以使用以下方法:
df = read.csv(file = 'd.csv')
df = read.csv(file = 'd.csv',skip = as.numeric(rownames(df[which(df[,1]!=''),])[1]))

如果您有大文件(因为需要导入两次),则不太有效率,但它可以工作。

如果您想导入一个具有相同问题(变量空行)的制表符分隔文件,则使用以下命令:

df = read.table(file = 'd.txt',sep='\t')
df = read.table(file = 'd.txt',skip = as.numeric(rownames(df[which(df[,1]!=''),])[1]))

逗号使用得很准确,但是用制表符分隔也可以行得通,对吧? - Alex
不要使用 read.csv 函数。因为该函数会寻找逗号,所以你会得到一个错误。 - CephBirk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接