Корреляция между переменными в нескольких файлах - PullRequest
0 голосов
/ 01 ноября 2019

У меня 280 * .csv файлов в каталоге. Каждый файл имеет 3 столбца и 1000 строк. Я хочу оценить корреляцию Пирсона между столбцами 2 и 3 каждого файла и поместить значение корреляции в первую ячейку столбца 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)
})

1 Ответ

0 голосов
/ 02 ноября 2019

Что касается первой части, это просто. Вы можете вычислить корреляции в цикле 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 = "")
})

Кроме того: Вам не нужно вызывать function(), когда вы используете функции, которые уже существуют (например, lapply() или cor()). Вам нужно использовать это только тогда, когда вы хотите определить новую функцию самостоятельно.

Если вы хотите получить вывод за один data.frame try:

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]))
  })
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...