代码之家  ›  专栏  ›  技术社区  ›  Nicolas Bourret

粘贴数据帧中的行以匹配另一个数据帧的行长度

  •  2
  • Nicolas Bourret  · 技术社区  · 6 年前

    从几个月前开始,我就在RStudio工作,但有一件事我很难做到。我有一个包含多个csv文件的目录,我需要在RStudio中导入这些文件。每个名称和日期有多个文件。

    csv文件的格式实际上很奇怪。csv中的所有数据(数字)从第7行开始。问题是需要从收集的文件中分别提取信息(名称、日期、设备等)。

    基本上 temp 中的数据帧 for 所有循环都有不同的行数(+200)。另一方面 info 所有数据帧都有一行(每个csv一行)。

    我想用 信息 针对相关数据df\U groinbar的长度复制了行(在csv中)。不要忘记每个csv的长度( df_groinbar dataframe)不同,因此 信息 df\U丁坝 需要为每个csv调整。

    df_groinbar <- data.frame()
    info <- data.frame()
    for (i in list.files("/Users/Nicolas/Dropbox/Groin Bar/"))
    {
      type <- str_extract(i, "([A-Z]+)")
      temp <- read_csv(i, skip = 6, col_names = c("elapsed_time", "left_squeeze", "right_squeeze", "left_pull", "right_pull"))
      info_temp <- select(read_csv(i, skip = 2, n_max = 1), 1:6)
      df_groinbar <- rbind(df_groinbar, temp)
      info <- rbind(info, info_temp)
    }
    

    我尝试过smartbind函数和更多函数,但都没有成功。

    非常感谢!

    尼古拉斯

    1 回复  |  直到 6 年前
        1
  •  1
  •   Tung    6 年前

    这就是你想要的吗?

    library(tidyverse)
    
    filePattern <- "\\.csv$"
    fileList <- list.files(path = "./Csv test/", recursive = FALSE,
                           pattern = filePattern, full.names = TRUE)
    
    read_file_custom <- function(fileName) {
    
      # skip 6 lines and select only the first 5 columns
      dat <- readr::read_csv(file = fileName, skip = 6, col_names = FALSE) %>% 
        select(., 1:5) 
    
      colName <- c("TimeFrame", "Left(squeeze)", "Left(pull)", "Right(squeeze)", "Right(pull)")
      names(dat) <- colName
    
      # now read the 3rd and 4th lines & keep only the first 6 columns
      indi_info <- readr::read_csv(file = fileName, skip = 2, col_names = TRUE, n_max = 1) %>% 
        select(., 1:6)
    
      # transfer individual data to dat
      dat <- dat %>% 
        mutate(NAME   = indi_info$NAME,
               DATE   = indi_info$DATE,
               TIME   = indi_info$TIME,
               DEVICE = indi_info$DEVICE,
               MODE   = indi_info$MODE,
               TEST   = indi_info$TEST)
    
      return(dat)
    }
    
    # Loop through all the files using map_df, read data 
    # and create a FileName column to store filenames
    # Clean up filename: remove file path and extension
    # Bind all files together
    
    result <- fileList %>%
      purrr::set_names(nm = (basename(.) %>% tools::file_path_sans_ext())) %>%
      purrr::map_df(read_file_custom, .id = "FileName") 
    result
    
    #> # A tibble: 10,460 x 12
    #>    FileName        TimeFrame `Left(squeeze)` `Left(pull)` `Right(squeeze)`
    #>    <chr>               <dbl>           <dbl>        <dbl>            <dbl>
    #>  1 Arianne-Robill~    0.0200          -1.00          2.25           -1.25 
    #>  2 Arianne-Robill~    0.0400          -1.00          2.25           -1.25 
    #>  3 Arianne-Robill~    0.0600          -1.00          2.25           -1.25 
    #>  4 Arianne-Robill~    0.0800          -1.00          2.25           -1.25 
    #>  5 Arianne-Robill~    0.100           -1.00          2.25           -1.25 
    #>  6 Arianne-Robill~    0.120           -1.00          2.00           -1.25 
    #>  7 Arianne-Robill~    0.140           -1.00          2.00           -1.00 
    #>  8 Arianne-Robill~    0.160           -0.750         2.00           -1.00 
    #>  9 Arianne-Robill~    0.180           -0.750         1.75           -0.750
    #> 10 Arianne-Robill~    0.200           -0.750         1.75           -0.750
    #> # ... with 10,450 more rows, and 7 more variables: `Right(pull)` <dbl>,
    #> #   NAME <chr>, DATE <chr>, TIME <time>, DEVICE <chr>, MODE <chr>,
    #> #   TEST <chr>
    

    创建日期:2018年3月28日 reprex package (v0.2.0)。