我希望将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
这意味着一开始就有一些逗号行。
答案 0 :(得分:7)
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 :(得分:2)
根据您的文件大小,这可能不是最佳解决方案,但可以胜任。
这里的策略是,不是用分隔符读取文件,而是读为行, 并计算字符并存储到temp中。 然后,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开始。
答案 2 :(得分: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]))