【问题标题】:Convert separate df in a folder into a single df in r将文件夹中的单独df转换为r中的单个df
【发布时间】:2020-01-14 12:08:55
【问题描述】:

我有一个文件夹,里面有几个 tsv 格式的数据帧文件(df1.txt、df2.txt、df3.txt...等)。我需要提取每个df(“freq”,“cdr”)中两列的数据并将它们聚合到一个带有两列的大型tsv数据帧中,加上第三个表示它们来自哪里的文件名( “文件”、“cdr”、“频率”)。

Individual df1:  "xxx" "freq"  "cdr" "zzz"
                  23   0.112   abc   ej
                  25   0.743   bbc   tj

final df:  "file"  "freq"  "cdr"
            df1     0.112   abc
            df1     0.743   bbc
            df2     0.444   abd
            df2     0.911   ccd

我尝试使用“list.files”,但这只是让我得到文件 (df) 名称的列表。我曾想过使用“解析”,但我不确定这个函数是如何工作的。作为 R 新手,我非常感谢您的帮助。

data.all <- list.files("/mnt/data/OUTPUT/", pattern="*.txt", full.names = TRUE)
sdata <- data.all[, "file", "freq", "cdr"

单个df1:“xxx”“freq”“cdr”“zzz” 23 0.112 abc ej 25 0.743 英国广播公司 tj

最终df:“文件”“频率”“cdr” df1 0.112 ABC df1 0.743 英国广播公司 df2 0.444 abd df2 0.911 ccd

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    用 tidyverse 包怎么样:

    library(tidyverse)
    
    #Lists contents of directory (data_dir) that satisfy regexp (end in .txt)
    data_dir <- "your/directory"
    your_df <- fs::dir_ls(data_dir, regexp = "\\.txt$")
    
    #Maps read_delim across contents of data_dir list
    your_df <- your_df %>% 
      map_dfr(read_delim, "\t", escape_double = FALSE, trim_ws = TRUE, .id = "source") %>%
    mutate(source = str_replace(basename(source), ".txt", ""))
    
    #selects your desired columns
    your_df <- your_df %>%
    select(freq, cdr, "file" = source)
    

    【讨论】:

    • 让我试一试。我没有想到那些库。
    • Greg,效果很好,除了一个小细节。 “文件”列列出了源的整个目录路径。有没有办法修剪它以仅显示实际的源文件名?
    • 是的,这是可能的。请参阅上面添加的对mutate 的调用,使用basename
    • 您添加的最后一段代码起到了作用。非常感谢。
    • 还有一件事,我怎样才能删除“.txt”扩展名并只列出文件名?
    【解决方案2】:

    类似于另一个 question ,我会简单地使用 for 循环?

    data.all <- list.files("/mnt/data/OUTPUT/", pattern="*.txt", full.names = FALSE)
    dat_tsv <- data.frame()
    
    for(i in data.all){
       dat <- read.delim(paste0("/mnt/data/OUTPUT/",i),stringASfactor=FALSE)
       dat <- dat[,c("freq","cdr")]
       dat$file <- gsub(".txt","",i)
       dat_tsv <- rbind(dat_tsv,dat)
    }
    

    【讨论】:

    • fra,我认为 dat
    • 我的错,文件不在工作目录中。 paste0("/mnt/data/OUTPUT/",i) 应该指向正确的路径 /mnt/data/OUTPUT/df1.txt
    • 嗯,现在看来路径加倍了。
    • 尝试将 full.names 设置为 FALSE
    猜你喜欢
    • 2017-09-13
    • 2021-10-06
    • 2018-11-17
    • 2020-06-12
    • 2023-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多