【问题标题】:How to extract columns from multiple csv files in R如何从R中的多个csv文件中提取列
【发布时间】:2021-06-24 20:57:22
【问题描述】:

抱歉这个简单的问题。我有一个非常基本的 R 脚本,它可以提取和计算一个非常大的 *.csv 文件中特定列下相同项目的出现次数,并给我一个项目列表及其频率,如下所示:

COLUMNNAME     freq

 item1         15

 item2         7

 item3         500

and so on... 

脚本是这样的:

library(plyr)
my_file<-read.csv(file='file1.csv', header=TRUE, sep = '')
count(my_file, vars='COLUMNNAME')

我的问题是如何为我的其他 25 个 *.csv 文件再次执行此操作,并将结果写入 output.csv 文件,如下所示:

COLUMNNAME   file1.csv    file2.csv    ......

item1            15            ?

item2            7             ?

item3           500           ?

and so on...

文件的结构相同,包含相同的项目,但频率不同。任何帮助深表感谢。提前致谢。

我在 csv 中的示例文件中的一个快照如下所示:

【问题讨论】:

    标签: r loops csv count frequency


    【解决方案1】:

    已编辑:我添加了评论中的代码。

    看看这是否有效

    library(tidyverse)
    library(data.table)
    
    # udf for collecting frequencies
    tableIt <- function(tbl){
      fread(tbl) %>% 
        select(colChosen) %>%  # change colChosen to the column name you're looking for
        {table(.)}
    }
    
    # collect file names and call udf
    filesToReview <- 
      list.files(path = whateverYourPathIs, 
                 pattern = "*.csv", 
                 full.names = T) %>%  # keep full directory
      # if you have files in subfolders, you can add recursive = T to look there, too
      set_names(str_extract(., "([^\\/]+$)")) %>%
      map(~tableIt(.))
    

    【讨论】:

    • 非常感谢。这就像一个魅力,除了一个没什么大不了的问题:它给了我一个这样的列表:``` item1 45 item1 76 item1 8 item2 13 item2 7 item2 140 ``` 列标题是频率,频率1, Freq2,Freq3.........我假设它按字母顺序处理文件?如果我将文件名作为频率的标题会更好:```ITEMS filex filez fileh item1 45 76 8 item2 13 7 140 item3 .................... ... ```
    • list.files()map() 之间,添加set_names(str_extract(., "([^\\/]+$)"))。这将为您提供文件名作为列表中每个表的名称。或者,您可以只使用set_names() 和文件名,以及路径将是列表中每个表的名称。
    【解决方案2】:

    您可以列出文件,例如使用list.files。然后你可以遍历文件,加载它们,并将它们添加到新data.frame 的底部。比如:

    library(tidyverse)
    
    csv.files <- list.files(pattern="*.csv", recursive=TRUE)
    bg.df <- NULL
    
    for (csv.file in csv.files) {
        if (is.null(bg.df)) {
            bg.df <- readr::read_csv(csv.file) %>%
          dplyr::mutate(
            file = csv.file
          )
        } else {
        bg.df <- bg.df %>%
          dplyr::add_row(
            readr::read_csv(csv.file) %>%
              dplyr::mutate(
                file = csv.file
              )
          )
        }
    }
    

    现在,您还可以使用 tidyr::pivot_wider 再次将它们变宽,但我不确定您的数据是什么样子的。

    无论如何,如果需要,您可以使用dplyr::group_bydplyr::summarize 进行总结。但是要写那一点,我需要一些示例数据/文件。

    【讨论】:

    • 感谢您的回复。这也奏效了。但它给了我一个文件,所有数据都在单独的列中附加了文件名,这很好。但有趣的是,整个文件只变成了两列,列名之间有 \t。我无法将它们分开,但我正在尝试,手指交叉。
    • @EmrahPeksoy 你有文件示例吗?
    • 我在上面的原帖上贴了一张照片。
    猜你喜欢
    • 2016-08-03
    • 2013-08-07
    • 2020-09-04
    • 2016-06-09
    • 1970-01-01
    • 1970-01-01
    • 2018-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多