如何通过使用 R 将每个文件的数据添加为附加行来将不同的 .csv 文件组合成一个完整的文件?

Posted

技术标签:

【中文标题】如何通过使用 R 将每个文件的数据添加为附加行来将不同的 .csv 文件组合成一个完整的文件?【英文标题】:How to combine different .csv files to one complete file by adding the data of every file as an additional row using R? 【发布时间】:2018-11-26 13:48:12 【问题描述】:

我有几个不同的文件夹,它们都包含一个 .csv 文件。所有这些 .csv 文件都有一个单独的列,其中包含一个实验条件的数据。 我想合并这些 .csv 文件,以便将每个文件的数据添加为新列。

目前,它看起来像这样:

C1.csv
102
106
152
196
223
486
553

C2.csv
296
299
843
1033
1996

但是,它希望有一个 .csv 文件,其中所有单独的文件都被复制到包含源文件名称的新列中,例如:

C1     C2     ...    Cn
102    296    ...    ...
106    299    ...
152    843    ...
196    1033   ...
223    1996   ...
486           ...
553           ...

到目前为止,我的代码如下:

myFiles = list.files(path = ".", recursive = TRUE, pattern = ".csv", full.names = TRUE)
data <- lapply(myFiles, read.table, sep="\t", header=FALSE)
Max <- max(sapply(data, length))
data <- lapply(data, function(x) c(x, rep(NA, Max - length(x))))
data <- do.call(cbind, data)
names(data) <- sub("^[^[:alnum:]]*([[:alnum:]]+)\\.csv$", "\\1", myFiles)

write.csv(data, "outfile.csv")

它生成了一个看起来像这样的文档,而不是在新列中添加每个 .csv 文件的数据:

enter image description here

【问题讨论】:

【参考方案1】:

这是你想要的吗? 请注意,我使用scan 读取文件。由于文件只有一列,因此不需要像read.csv 这样的复杂函数。

myFiles <- list.files(path = ".", pattern = "^C.*\\.csv", full.names = TRUE, recursive = TRUE)
data <- lapply(myFiles, scan)
Max <- max(sapply(data, length))
data <- lapply(data, function(x) c(x, rep(NA, Max - length(x))))
data <- do.call(cbind, data)
names(data) <- sub("^[^[:alnum:]]*([[:alnum:]]+)\\.csv$", "\\1", myFiles)

write.csv(data, "outfile.csv")

"outfile.csv"的内容是

"","V1","V2"
"1",102,296
"2",106,299
"3",152,843
"4",196,1033
"5",223,1996
"6",486,NA
"7",553,NA

【讨论】:

它还没有按预期运行。现在,它会生成一个 .csv 文档,看起来就像添加到原始问题中的那个。 这就是我要找的。谢谢!【参考方案2】:

可以使用read.table 读取列表中的所有文件。使用dplyr::bind_rows 合并所有数据。然后,使用reshape2::dcast 以宽格式传播数据,并为每个文件中的数据提供一列。

# Get list of files in directory
fileList <- list.files(".", "*.csv", full.names = TRUE)

# Read file data. This will generate a list containing dataframes
listData <- lapply(fileList, read.table)

# Name list using name of files
names(listData) <- gsub(".csv","",basename(fileList))

library(tidyverse)
library(reshape2)

bind_rows(listData, .id = "FileName") %>%
  group_by(FileName) %>%
  mutate(rowNum = row_number()) %>%
  dcast(rowNum~FileName, value.var = "V1") %>%
  select(-rowNum) %>%
  write.csv(file="Result.csv")

# Content of Result.csv
# "","C1","C2"
# "1",102,296
# "2",106,299
# "3",152,843
# "4",196,1033
# "5",223,1996
# "6",486,NA
# "7",553,NA

【讨论】:

这似乎工作得很好!但是如何将其保存为新的 .csv 文件?我已输入代码write_csv(listData, "C:/Users/XYZ/Desktop/Result.csv"),但随后出现此错误消息:Error: is.data.frame(x) is not TRUE。是不是不能用write_csv()here? @Marc 你现在可以看看答案。 result.csv 将包含结果。如果有效,那么您可以通过单击答案框左侧的tick 符号来接受答案。 不错,basename,我完全忘记了。 谢谢。你也得到了一个很好的答案。

以上是关于如何通过使用 R 将每个文件的数据添加为附加行来将不同的 .csv 文件组合成一个完整的文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过基于R中的条件过滤行来读取文件

如何将信息附加到 R 中 netCDF 文件中的数组

有人知道如何创建一个快捷方式来将选定的文件附加到 iMessage 吗?

如何在 okhttp3 中为每个多部分图像文件添加附加信息

R方法通过将整个数据集向上移动一个小时/向下移动一个小时半年来将标准转换为夏令时?

如何通过将 csv 数据存储在变量中来将其访问到 yml 文件中?