R中的人将如何在矩阵上使用“ if”语句应用“ for”函数以创建平滑函数

问题描述 投票:2回答:1

所以这是我的问题:

我有一个巨大的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]。因为没有左邻居,所以平滑不起作用,并引发错误。由于这些列表示从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 ...

r function loops matrix apply
1个回答
0
投票

避免循环和if条件的一种可能性是创建一个新矩阵,在此矩阵中,您将最后两列粘贴到开头,将前两列粘贴到结尾。

© www.soinside.com 2019 - 2024. All rights reserved.