【问题标题】:How to merge 20+ csv files into 1 dataframe in R (adding new columns each time a new file is added)如何将 20 多个 csv 文件合并到 R 中的 1 个数据框中(每次添加新文件时添加新列)
【发布时间】:2021-04-18 13:07:48
【问题描述】:

我有 26 个具有相同行数和列数的 csv 文件,我希望将它们合并到 R 中的单个数据帧中。下面给出了修改后的示例。

file1.csv

chrom   pos     PI
3       23435  0.1
3       35465  0.1
3       36487  0.2
3       37888  0.4
3       38516  0.1

file2.csv

chrom   pos     PI
3       23435  0.1
3       35465  0.1
3       36487  0.2
3       37888  0.4
3       38516  0.1

期望的输出

chrom   pos     PI   chrom   pos     PI
3       23435  0.1   3       23435  0.1
3       35465  0.1   3       35465  0.1
3       36487  0.2   3       36487  0.2
3       37888  0.4   3       37888  0.4
3       38516  0.1   3       38516  0.1

我编写了以下代码,没有错误:

library(data.table)

file_list <- list.files('/home/aahm/SoftMaker/Documents/Aaisha/MPhil_PhD/2021/1.January/Results/csv_files/sitepi/ACKR2', pattern="*.csv", full.names=TRUE)

ldf <- lapply(file_list , read.csv)
df.final <- do.call("rbind", ldf)

View (df.final)

但是,outfile 数据框的格式如下:

chrom   pos     PI
3       23435  0.1
3       35465  0.1
3       36487  0.2
3       37888  0.4
3       38516  0.1
3       23435  0.1
3       35465  0.1
3       36487  0.2
3       37888  0.4
3       38516  0.1

我的编码有什么问题?我该怎么做?如果有任何帮助,我将不胜感激?

【问题讨论】:

    标签: r dataframe merge


    【解决方案1】:

    如果我理解您需要不同的排序方式...

    df.final <- df.final[order(df.final$chrom, df.final$pos, df.final$PI),]
    
    
       chrom   pos  PI
    1      3 23435 0.1
    6      3 23435 0.1
    2      3 35465 0.1
    7      3 35465 0.1
    3      3 36487 0.2
    8      3 36487 0.2
    4      3 37888 0.4
    9      3 37888 0.4
    5      3 38516 0.1
    10     3 38516 0.1
    

    【讨论】:

      【解决方案2】:

      您应该使用cbind 而不是rbind

      > do.call(cbind, ldf)
        chrom   pos  PI chrom   pos  PI
      1     3 23435 0.1     3 23435 0.1
      2     3 35465 0.1     3 35465 0.1
      3     3 36487 0.2     3 36487 0.2
      4     3 37888 0.4     3 37888 0.4
      5     3 38516 0.1     3 38516 0.1
      

      更新

      如果你想删除列 1,2,4,5,....,你可以试试下面的代码

      z <- do.call(cbind, ldf)
      inds <- seq(1, length(z), by = 3)
      z[-c(inds, inds + 1)]
      

      数据

      > dput(ldf)
      list(structure(list(chrom = c(3L, 3L, 3L, 3L, 3L), pos = c(23435L, 
      35465L, 36487L, 37888L, 38516L), PI = c(0.1, 0.1, 0.2, 0.4, 0.1
      )), class = "data.frame", row.names = c(NA, -5L)), structure(list(
          chrom = c(3L, 3L, 3L, 3L, 3L), pos = c(23435L, 35465L, 36487L,
          37888L, 38516L), PI = c(0.1, 0.1, 0.2, 0.4, 0.1)), class = "data.frame", row.names = c(NA,  
      -5L)))
      

      【讨论】:

      • 非常感谢。这真太了不起了。它在一秒钟内起作用! R 只是让事情变得如此简单。现在,假设我必须删除第 1、4、5、7、8、10、11 等列直到最后,因为它们是重复的。我可以手动执行此操作,但有没有更巧妙的方法。
      • 要删除的列号是y和z,其中y = 1+3x (x = 1-25) z = 2+3x 我还注意到所有x列都有相同的列名(chrom ) 并且所有 y 列具有相同的列名 (pos)。按列名删除很容易,但我需要第一次出现第 y 列(pos)。所以也许按索引工作会更好。我尝试了各种选项,但似乎都没有正常工作。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-20
      • 2017-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-03
      相关资源
      最近更新 更多