【问题标题】:Can a column of data from several .csv files (stored in the same folder) be compiled into a single column?可以将来自多个 .csv 文件(存储在同一文件夹中)的一列数据编译成一列吗?
【发布时间】:2021-10-05 03:36:38
【问题描述】:

我想从几个(很多!) .csv 文件中提取一些列,并构建一个新的 .csv 文件,其中所有列都堆叠在一起。所有 .csv 文件都在一个文件夹中,除了一列数据外几乎相同。大多数列需要保持完全相同,但需要从其中一列的标题中的名称生成一个新列(这是唯一会更改的标题),我想删除一些不需要的列数据。这是一个我希望发生的示例,但简化为仅两个数据集:

Data set 1
   X        date distance.code location.code Time1     unneeded.data
   1 2021/05/18             C          BSF1 0.715               999
   2 2021/05/18            30          BSF1 0.896               999
   3 2021/05/18            60          BSF1 0.803               999
   4 2021/05/18           120          BSF1 0.705               999
   5 2021/05/18             C          BSG1 0.563               999
   6 2021/05/18             C          BSG1 0.961               999
   7 2021/05/18            30          BSG1 0.833               999
   8 2021/05/18            60          BSG1 0.894               999
 
data set 2                                                                        
  X       date distance.code location.code  Time2     unneeded data
  1 2021/05/18             C          BSF1 0.806               999
  2 2021/05/18            30          BSF1 0.878               999
  3 2021/05/18            60          BSF1 0.625               999
  4 2021/05/18           120          BSF1 0.609               999
  5 2021/05/18             C          BSG1 0.766               999
  6 2021/05/18             C          BSG1 0.846               999
  7 2021/05/18            30          BSG1 0.856               999
  8 2021/05/18            60          BSG1 0.698               999

Combined datasets (this is what I want)                                                                           
  X       date distance.code location.code        timeperiod   Values
  1 2021/05/18             C          BSF1             Time1 0.715
  2 2021/05/18            30          BSF1             Time1 0.896
  3 2021/05/18            60          BSF1             Time1 0.803
  4 2021/05/18           120          BSF1             Time1 0.705
  5 2021/05/18             C          BSG1             Time1 0.563
  6 2021/05/18             C          BSG1             Time1 0.961
  7 2021/05/18            30          BSG1             Time1 0.833
  8 2021/05/18            60          BSG1             Time1 0.894
  1 2021/05/18             C          BSF1             Time2 0.806
  2 2021/05/18            30          BSF1             Time2 0.878
  3 2021/05/18            60          BSF1             Time2 0.625
  4 2021/05/18           120          BSF1             Time2 0.609
  5 2021/05/18             C          BSG1             Time2 0.766
  6 2021/05/18             C          BSG1             Time2 0.846
  7 2021/05/18            30          BSG1             Time2 0.856
  8 2021/05/18            60          BSG1             Time2 0.698 

如您所见,时间列的唯一标题已移至新列。我一直在尝试通过从文件夹中的所有文件创建一个列表然后尝试将它们与 rbind 绑定来执行此操作或此过程的某些部分。

temp <- list.files(pattern="*.csv")
myfiles = lapply(temp,read.csv)

df <- do.call(rbind, myfiles)

这不起作用,但似乎应该这样做。此外,这甚至不能完成我想要的一切,但我不知道如何获得具有唯一时间码的新列。我认为这可能是一种混乱的方式,我希望有一个更优雅的解决方案。感谢您的帮助。

【问题讨论】:

    标签: r data-manipulation


    【解决方案1】:

    您可以select最终数据中所需的列,并使用pivot_longer获取长格式数据。使用map_df,您可以将列表合并到一个数据框中。

    library(dplyr)
    library(purrr)
    
    temp <- list.files(pattern="*.csv")
    myfiles = lapply(temp,read.csv)
    
    cols_to_keep <- c('X', 'date','distance.code', 'location.code')
    
    combine_data <- map_df(myfiles, ~.x %>% 
          select(all_of(cols_to_keep), starts_with('Time')) %>%
          pivot_longer(cols = starts_with('Time'), 
                       names_to = 'timeperiod', 
                       values_to = 'Values'))
    

    【讨论】:

    • 这非常有效! pivot_longer 函数似乎是 tidyr 的一部分,所以我只需要包含该库。谢谢你的帮助!!
    • 有谁知道为什么这可能会停止工作。我之前在一个数据集上使用过此代码,然后切换到另一个相同的数据集,但现在我收到一个错误:“错误:cols 必须选择至少一列。”有谁知道为什么会发生这种情况?
    【解决方案2】:

    我认为你应该使用 dplyr 包中的bind_rows

    library(dplyr)
    df <- bind_rows(myfiles)
    

    【讨论】:

      猜你喜欢
      • 2022-01-19
      • 2019-08-26
      • 1970-01-01
      • 1970-01-01
      • 2022-12-21
      • 1970-01-01
      • 1970-01-01
      • 2013-03-29
      • 2012-05-11
      相关资源
      最近更新 更多