Итак, вот моя проблема:
У меня есть огромный CSV-файл с большим количеством точек данных. Каждая строка представляет значения, принадлежащие эксперименту.
col1 , col2, col3, col4, col5, col6, ..., coln-1, coln
exp_1 190 10000 845 20 100 67 ..., 2 634
exp_2 3 567 87 465 23 867 ..., 987 43
.
.
.
Каждый эксперимент может быть представлен в гистограмме, но значения должны быть сглажены по среднему значению их четырех соседей. Так, например, значение 845 на matrix[1,3]
будет перезаписано на mean(matrix[1,1]:matrix[1,5])
. Проблема, которая возникает в позиции matrix[1,1]
. Поскольку не осталось левых соседей, сглаживание не работает и выдает ошибку. Поскольку столбцы представляют круговое измерение в диапазоне от 0°
до 360°
, значения в coln
фактически представляют левого соседа col1
.
Если я извлекаю вектор exp_1
матрицы(x=matrix[1,]
) и примите это в качестве входного аргумента для следующего кода, все будет работать гладко.
for ( i in 1:length(x)){
if (i < 2) {
x[i] = mean(c(x[i:(i+2)],x[(length(x)-i):(length(x))]))
} else if (i >= 2){
x[i] = mean(x[(i-2):(i+2)])
} else if (i > (length(x)-2)){
x[i] = mean(c(x[(i-2):i],x[1:abs(length(x)-(i+2))]))
}
}
Поскольку в моей матрице есть масса экспериментов, я хочу выполнить цикл по матрице, а не в одиночкувытащить каждую строку и запустить мой сценарий на нем. Поэтому я попытался записать свой сценарий в функцию, которая выглядит следующим образом:
smoothing_function = function(x){
for ( i in 1:length(x)){
if (i < 2) {
x[i] = mean(c(x[i:(i+2)],x[(length(x)-i):(length(x))]))
} else if (i >= 2){
x[i] = mean(x[(i-2):(i+2)])
} else if (i > (length(x)-2)){
x[i] = mean(c(x[(i-2):i],x[1:abs(length(x)-(i+2))]))
}
}
}
Затем я хотел apply(matrix,1,smoothing_function)
, что приводит к NULL
. Я также попытался mapply(smoothing_function,matrix)
, что приводит к NULL
для каждого столбца всей матрицы.
Я думаю, что проблема находится в части length(x)
, потому что входной аргумент не вектор, а единственный элемент,Поэтому функция не может вычислить среднее значение для любых соседей, поскольку длина одного элемента равна всего лишь 1
.
Так что либо мне нужно сгенерировать вектор для каждого эксперимента из матрицы, либо мне нужно изменитьмоя функция. Ребята, у вас есть идеи?