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