【问题标题】:Subsetting data from multiple CSV files with missing headings in RR中缺少标题的多个CSV文件的子集数据
【发布时间】:2019-07-27 12:29:56
【问题描述】:

我在多个 CSV 文件中有来自活动记录仪设备的数据。我想从这些文件中提取三行并将它们合并到一个数据框中。

问题是第一行只有第一列有数据(想想 Excel 中的 1A),但有些行有 13 列中的数据。因此缺少几个列名。

我首先尝试像这样组合所有 csv 文件:

file.list <- list.files(pattern='*.csv')
df.list <- sapply(file.list, read.csv, simplify=FALSE)

library(dplyr)
df <- bind_rows(df.list, .id = "id")

这里的第二个命令给出了“不允许重复的'row.names'”错误。我尝试添加 row.names=NULL 参数,但这会导致“输入中没有可用的行”错误消息。

对于单个数据文件,我可以通过先命名列然后对数据进行子集化来实现所需的结果:

test <- read.csv("test3.csv",header=FALSE)

names(test) <-c("Column.A","Column.B","Column.C","Column.D","Column.E","Column.F","Column.G",
                "Column.H","Column.I","Column.J","Column.K", "Column.L", "Column.M")

bar <- subset(test, Column.A =="Identity:" | Column.A == "Interval Type"| Column.A == "Sleep Summary" & Column.B == "Average(n)")

如何对给定文件夹中的所有 csv 文件重复类似的过程?

谢谢!

【问题讨论】:

    标签: r csv


    【解决方案1】:

    我们可以通过定义一个辅助函数来对每个文件执行多个操作来做到这一点。这在假设每个文件具有相同数量的列的情况下起作用,并且具有与 names 向量中定义的相同的 names

    library(tidyverse)
    
    readFile <- function(file){
        df <- read.csv(file, header=FALSE)
        names(df) <-c("Column.A","Column.B","Column.C","Column.D","Column.E","Column.F","Column.G",
                    "Column.H","Column.I","Column.J","Column.K", "Column.L", "Column.M")
        df <- subset(df, Column.A =="Identity:" | Column.A == "Interval Type"| Column.A == "Sleep Summary" & Column.B == "Average(n)")
        return(df)
    }
    
    file.list <- list.files(pattern='*.csv')
    df.list <- sapply(file.list, readFile, simplify=FALSE) %>% bind_rows()
    

    【讨论】:

      【解决方案2】:

      只需在sapply 中扩展您的功能。事实上,使用read.csvcol.names 参数,并在paste0 调用中使用LETTERS 向量。此外,在您的subset 中使用%in% 运算符:

      df.list <- sapply(file.list, function(f) {
                    # READ DATA AND ASSIGN COL NAMES
                    tmp <- read.csv(f, header=FALSE, col.names = paste0("Column.", LETTERS[1:13])
      
                    # SUBSET DATA
                    bar <- subset(tmp, Column.A %in% c("Identity:", "Interval Type") |
                                       Column.A == "Sleep Summary" & Column.B == "Average(n)")
                 }, simplify=FALSE)
      
      
      final_df <- do.call(rbind, df.list)
      

      【讨论】:

        【解决方案3】:

        我发现您需要在此之前清理您的数据

        您可以使用名为“SQLDF”的库来查询您的 3 Dataframes (CSV) 库!

        例如: 我做了一个例子,假设我们有 3 个数据框,所以你可以得到你需要的列。

        我希望这会有所帮助!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-10-25
          • 2012-03-12
          • 1970-01-01
          • 2020-07-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多