【问题标题】:Select multiple column from different directory and then merge them in R从不同目录中选择多列,然后将它们合并到 R
【发布时间】:2018-03-10 02:19:33
【问题描述】:

我有一个目录,在我的目录中有多个文件。每个文件都有不同的 csv。例如在我的目录中有 5 个文件(实际情况超过 100 个),每个文件有 10 个 .csv 文件。

我的问题是我想从这些文件中选择不同的列(所有文件的列数相同)并将它们合并并创建一个数据框。

我的数据框看起来像 -

主目录-

File1-

a.csv -

 store_code  Tran1  Tran2  Tran3
     10       5454   7645   7111
     10       4154   7675   7000
     10       1454   2145   8431
      .........

b.csv -

 store_code  Tran1  Tran2  Tran3
     10       5004   6645   7291
     10       4109   1675   7000
     10       9454   1045   1031
      .........

 File2-

 c.csv - 

 store_code  Tran1  Tran2  Tran3
     20       1054   2045   1111
     20       2954   3075   7080
     20       1454   2145   8431
      .........

  d.csv - 

 store_code  Tran1  Tran2  Tran3
     20       1994   2045   9011
     20       2004   3075   8080
     20       1004   2145   1031
      .........

我已经合并了一个目录中的所有文件。但无法选择多列然后合并。对于这个例子,假设我想选择两列 store_code 和 Tran2 然后合并它们。

出于合并目的,我完成了以下代码 -

i.Main directory set as a working directory where all files are there.
ii.csv_files <- dir(pattern='.*[.]csv', recursive = T)

library(dplyr)
df <- rbind_all(lapply(csv_files, read.csv))

我的预期输出 -

store_code    Tran3 
10            7111 
10            7000 
10            1111  
..            ---- 
20            9011
20            8080

【问题讨论】:

  • 每个 CSV 文件中有两列标记为 Tran2。是不是打错字了?
  • 所以你只想从每个文件中读取 2 列然后合并在一起?
  • @Tung - 你是对的..
  • @Maurits - Typo..Tran3
  • 您的预期输出没有用。请正确格式化您的代码,并提供基于您的示例数据的预期输出。

标签: r dplyr plyr


【解决方案1】:

我不完全确定你在追求什么;不幸的是,您没有提供预期的输出。

也许是这样的?

library(tidyverse);
Reduce(
    function(x, y) full_join(x, y, by = c("store_code", "Tran2")),
    lapply(csv_files, read.csv));
#  store_code Tran1.x Tran2 Tran3.x Tran1.y Tran3.y Tran1.x.x Tran3.x.x
#1         10    5454  7645    7111      NA      NA        NA        NA
#2         10    4154  7675    7000      NA      NA        NA        NA
#3         10    1454  2145    8431      NA      NA        NA        NA
#4         10      NA  6645      NA    5004    7291        NA        NA
#5         10      NA  1675      NA    4109    7000        NA        NA
#6         10      NA  1045      NA    9454    1031        NA        NA
#7         20      NA  2045      NA      NA      NA      1054      1111
#8         20      NA  3075      NA      NA      NA      2954      7080
#9         20      NA  2145      NA      NA      NA      1454      8431
#  Tran1.y.y Tran3.y.y
#1        NA        NA
#2        NA        NA
#3        NA        NA
#4        NA        NA
#5        NA        NA
#6        NA        NA
#7      1994      9011
#8      2004      8080
#9      1004      1031

解释:对所有 CSV 文件做一个外部full_join,由store_codeTran2 合并。因为每个文件有两个 Tran2 列,所以我将最后一列重新标记为 Tran3

从这里开始,剩下要做的就是对列进行一些整理和重命名以反映源文件的来源。


样本数据

这是lapply(csv_files, read.csv)dput

list(structure(list(store_code = c(10L, 10L, 10L), Tran1 = c(5454L,
4154L, 1454L), Tran2 = c(7645L, 7675L, 2145L), Tran3 = c(7111L,
7000L, 8431L)), .Names = c("store_code", "Tran1", "Tran2", "Tran3"
), class = "data.frame", row.names = c(NA, -3L)), structure(list(
store_code = c(10L, 10L, 10L), Tran1 = c(5004L, 4109L, 9454L
), Tran2 = c(6645L, 1675L, 1045L), Tran3 = c(7291L, 7000L,
1031L)), .Names = c("store_code", "Tran1", "Tran2", "Tran3"
), class = "data.frame", row.names = c(NA, -3L)), structure(list(
store_code = c(20L, 20L, 20L), Tran1 = c(1054L, 2954L, 1454L
), Tran2 = c(2045L, 3075L, 2145L), Tran3 = c(1111L, 7080L,
8431L)), .Names = c("store_code", "Tran1", "Tran2", "Tran3"
), class = "data.frame", row.names = c(NA, -3L)), structure(list(
store_code = c(20L, 20L, 20L), Tran1 = c(1994L, 2004L, 1004L
), Tran2 = c(2045L, 3075L, 2145L), Tran3 = c(9011L, 8080L,
1031L)), .Names = c("store_code", "Tran1", "Tran2", "Tran3"
), class = "data.frame", row.names = c(NA, -3L)))

【讨论】:

  • 我的预期输出看起来像 - store_code Tran2 10 7645 10 7000 10 2145 ......................... 10 6645 10 1675 ----------- 表示只有两列与所有合并的行。
  • 我的错误是..最后一列名称是 Tran3..我运行您的代码但它不起作用...我想知道我的预期输出是什么...任何解决方案?
  • @NikitaAgarwal 不要将代码放入 cmets。编辑您的问题以包含您的预期输出。请参阅here how to provide a minimal reproducible example/attempt,包括示例数据和预期输出。
猜你喜欢
  • 2018-10-14
  • 2018-09-22
  • 2014-06-03
  • 2021-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-18
  • 1970-01-01
相关资源
最近更新 更多