所以这是我的问题:
我有一个巨大的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
.
.
.
每个实验都可以用直方图表示,但是需要通过四个邻居的平均值对值进行平滑处理。因此,例如matrix[1,3]
处的值845将被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
。
因此,我需要为矩阵中的每个实验生成一个向量,或者需要修改我的函数。你们有什么想法吗?
所以这是我的问题:我有一个很大的csv文件,其中包含很多数据点。每行代表属于实验的值。 col1,col2,col3,col4,col5,col6,...,coln-1,coln exp_1 ...
避免循环和if
条件的一种可能性是创建一个新矩阵,在此矩阵中,您将最后两列粘贴到开头,将前两列粘贴到结尾。