【问题标题】:Merge specific columns from csv files and use the filenames as headers合并 csv 文件中的特定列并将文件名用作标题
【发布时间】:2017-04-21 03:15:49
【问题描述】:

我想合并两个 csv 文件中的特定列,并使用文件名作为列标题。在此示例中,我想将每个文件的第三列合并到一个数据框中。 csv 文件的行数和列数相同。

样本数据集:

文件1.csv

V1,V2,V3,V4
1,1986,64,61

文件2.csv

V1,V2,V3,V4
1,1990,100,61

预期结果:

"File1","File2"
64,100

这是我的脚本:

my.file.list <- list.files(pattern = "*.csv")
my.list <- lapply(X = my.file.list, FUN = function(x) {
        read.csv(x, header=TRUE,colClasses = c("NULL", "NULL", "numeric",    "NULL"), sep = ",")[,1]
    })
my.df <- do.call("cbind", my.list)

如何根据文件名添加列标题?

我试过这个:

sub('.csv','',basename(my.file.list),fixed=TRUE)

但我不知道如何将其添加为标题。

我将不胜感激。

【问题讨论】:

  • 请向我们展示您的预期输出。 use the filename as the column header 是什么意思?
  • 感谢您的评论。我编辑了我的问题。
  • 两个文件的行数不一样怎么办?
  • 两个文件的行数和列数相同。我尝试使用 basname(),但我不知道如何将它们作为标题添加到输出文件中。

标签: r csv lapply cbind


【解决方案1】:
my.file.list <- list.files(pattern = "*.csv")
my.list <- list()
for (i in 1:length(my.file.list)) {
    df <- read.csv(my.file.list[[i]], header=TRUE, sep=",")["V3"]
    names(df) <- paste0("FILE", i)
    my.list[[i]] <- df
}
my.df <- do.call("cbind", my.list)

【讨论】:

  • 对不起,列名应该是"File1","File2"
  • 非常感谢。我现在明白了!
【解决方案2】:

@Tim Biegeleisen 非常感谢您的帮助。我现在明白了。这是您答案的改进版本,我可以将其用于具有不同文件名的文件。

 my.file.list <- list.files(pattern = "*.csv")
 my.list <- list()
 for (i in 1:length(my.file.list)) {
   df <- read.csv(my.file.list[[i]], header=TRUE, sep=",")["V3"]
    names(df) <-paste0(sub('.csv','',basename(my.file.list[i]),fixed=TRUE), i)
 my.list[[i]] <- df
 }
 my.df <- do.call("cbind", my.list)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-19
    • 1970-01-01
    • 2016-03-16
    • 1970-01-01
    • 2018-08-31
    • 2021-04-25
    • 1970-01-01
    • 2019-03-25
    相关资源
    最近更新 更多