在R中使用read.csv跳过特定行

37

我希望在将CSV文件导入R数据框时跳过第1行和第3行。

原文件标题位于第2行。

使用read.csv中的skip参数可以跳过第1行,并将header参数设置为TRUE,但仍会在我的数据框中保留原始文件中的第3行。

有人能建议如何在R中跳过多个特定行吗?下面是我能够凑巧拼凑的代码:

我可以传递一个向量到skip参数中,指定要忽略的确切行吗?

prach <- read.csv("RSRAN104_-_PRACH_Propagation_Delay-PLMN-day-rsran_RU50EP1_reports_RSRAN104_xml-2016_08_23-21_33_03__604.csv", header = TRUE, sep = ",", stringsAsFactors = FALSE, skip = 1)

我很想看看别人怎么说,但如果第一行和第三行不为空,你可能需要跳过所有三行并手动管理标题名称。 - Sevyns
2
如果您不介意手动修改文件,可以在第三行添加一个“注释字符”(如“#”),然后执行以下操作:read.csv(file, skip = 1, header = T, comment.char = "#") - Abdou
为什么不跳过第一行,从第二行开始读取包含标题的csv文件,并在read.csv()之后删除第三行? - mdd
相关帖子:https://dev59.com/cWUo5IYBdhLWcg3wpg_N - zx8754
2个回答

73

其中一种方法是使用两个read.csv命令,第一个读取标题,第二个读取数据:

headers = read.csv(file, skip = 1, header = F, nrows = 1, as.is = T)
df = read.csv(file, skip = 3, header = F)
colnames(df)= headers

我已经创建了下面的文本文件来测试这个:

do not read
a,b,c
previous line are headers
1,2,3
4,5,6

结果如下:
> df
  a b c
1 1 2 3
2 4 5 6

2

我的完美解决方案:


#' read csv table, wrapper of \code{\link{read.csv}}
#' @description read csv table, wrapper of \code{\link{read.csv}}
#' @param tolower whether to convert all column names to lower case
#' @param skip.rows rows to skip (1 based) before read in, eg 1:3
#' @return returns a data frame
#' @export
ez.read = function(file, ..., skip.rows=NULL, tolower=FALSE){
    if (!is.null(skip.rows)) {
        tmp = readLines(file)
        tmp = tmp[-(skip.rows)]
        tmpFile = tempfile()
        on.exit(unlink(tmpFile))
        writeLines(tmp,tmpFile)
        file = tmpFile
    }
    result = read.csv(file, ...)
    if (tolower) names(result) = tolower(names(result))
    return(result)
}

这为我解决了一个棘手的问题,我的ASCII文件底部有元数据需要跳过,同时头也需要跳过。我喜欢当我使用该函数时还可以传递命令给read.csv。我使用了: test <- ez.read(paste(path, "filename.ASC", sep = ""), skip.rows = c(233:247), sep = "", header = FALSE, col.names = col_names) - user2860703
我很高兴它能帮到您! - Jerry T

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