【问题标题】:Correlation between variables in multiple files多个文件中变量之间的相关性
【发布时间】:2019-11-01 09:18:08
【问题描述】:

我在一个目录中有 280 个 *.csv 文件。每个文件有 3 列和 1000 行。我想估计每个文件的第 2 列和第 3 列之间的 Pearson 相关性,并将相关值放在第 4 列的第一个单元格中,并将所有 280 个相关值放在一个单独的文件中。我如何在 R 中做到这一点?

我尝试了几个代码,包括下面的代码,虽然我知道是不正确的,但我不知道该怎么写。请帮忙。

files <- list.files(path="mydirectory", pattern="*.csv", full.names=TRUE, 
recursive=FALSE)
function(files)
lapply(files,function(x){
  x <- read.csv(files, header = TRUE)
   out <- function(cor(files[,2:3])
    write.csv(out, sep = "\t", quote = FALSE, row.names = FALSE)
})

【问题讨论】:

    标签: r


    【解决方案1】:

    至于第一部分,这很简单。您可以在 lapply 循环中计算相关性并将它们写入新文件:

    lapply(files, function(f) {
      # Read CSV data
      csv_data <- read.csv(f, header=TRUE)
      # Calculate correlation
      csv_data[, 4] <- cor(csv_data[, 2], csv_data[, 3])
      # Create a new filename by replacing the ending of the 
      # input file (.csv) with (_cor.csv)
      newfile <- gsub("\\.csv$", "_cor.csv", f)
      write.csv(csv_data, file = newfile, quote = FALSE)
    })
    

    由于 R 希望 data.frames 中的列具有相同的行数,这将用相关值填充第 4 列的每一行。我会顺其自然,但如果你有很多数据,这可能会浪费存储空间。这是一个不太优雅的解决方案,仅在第一行中具有相关性:

    lapply(files, function(f) {
      # Read CSV data
      csv_data <- read.csv(f, header=TRUE)
      # Calculate correlation
      csv_data[, 4] <- cor(csv_data[, 2], csv_data[, 3])
      # Now delete duplicate values of cor
      csv_data[2:nrow(csv_data), 4] <- NA
      # Create a new filename by replacing the ending of the 
      # input file (.csv) with (_cor.csv)
      newfile <- gsub("\\.csv$", "_cor.csv", f)
      # Now when we write, we tell R to write an empty string when it encounters
      # missing values
      write.csv(csv_data, file = newfile, quote = FALSE, na = "")
    })
    

    还有: 当您使用已经存在的函数(如lapply()cor())时,您不需要调用function()。仅当您想自己定义新函数时才需要使用它。

    如果您想在单个 data.frame 中输出,请尝试:

    my_df <- do.call(rbind,
      lapply(files, function(f) {
        # Read CSV data
        csv_data <- read.csv(f, header=TRUE)
        # Calculate correlation
        data.frame(File=f, Correlation=cor(csv_data[, 2], csv_data[, 3]))
      })
    )
    

    【讨论】:

    • 这太棒了,正是我所需要的。非常感谢。
    • 如果这解决了您的问题,请接受答案,这样它就不会显示在未解决的问题中。谢谢!
    • 如何获取一个文件中所有280个样本的相关值,每一行都有一个文件的cor值?
    • 我正在考虑手动完成所有这些操作,这将花费我至少一个月的时间,因为我有几个这样的文件,这只是一个。我不知道该怎么感谢你。最良好的祝愿!
    猜你喜欢
    • 1970-01-01
    • 2019-02-27
    • 1970-01-01
    • 1970-01-01
    • 2020-05-28
    • 2019-05-14
    • 2021-02-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多