R: Ошибка в матрице [i, 1]: неправильное количество измерений

С DV и FF в качестве векторов длины 47:

analyse <- function(DV,FF)
{
correct <- rep(0,47)
matrix <- array(rep(0,47*3), dim=c(47,3))

for(i in 1:47)
{
if(DV[i] > 50) {if(FF[i] > 50) {correct[i] <- i}
}
else
{
if(FF[i] < 0){correct[i] <- i}}
}

for(i in 1:47)
{
if((correct[i] == 0) == FALSE)
{
matrix[i,1] <- DV[i]
matrix[i,2] <- FF[i]
matrix[i,3] <- matrix[i,1] - matrix[i,2]
}
}

for(i in 47:1)
{
if(matrix[i,1]==0) {matrix<-matrix[-i]
}
}
return(matrix)
}

Я не понимаю, почему я получаю эту ошибку:

Ошибка в матрице[i, ​​1]: неправильное количество измерений

заранее спасибо

[править] пример данных:

DV <- c(56.2, 59.2, 50.9, 46.9, 50.7, 47.3, 53.6, 57.8, 42.7, 45.0, 47.3, 44.1, 51.5, 50.0, 50.3, 50.4, 51.7, 47.8, 46.8, 40.0, 45.5, 57.4, 51.6, 36.1, 34.8, 41.2, 59.1, 62.5, 55.0, 53.8, 52.4, 44.5, 42.2, 50.1, 61.3, 49.6, 38.2, 51.1, 44.7, 40.8, 46.1, 53.5, 54.7, 50.3, 48.8, 53.7, 52.0)

DF <- c(49.95662, 51.93295, 53.02263, 50.00784, 48.55493, 49.93520, 48.70022, 50.98856, 52.51411, 47.02938, 47.86480, 48.70022, 47.53790, 50.22578, 49.68094, 49.78991, 49.82623, 50.29842, 48.88184, 48.51861, 46.04866, 48.04641, 52.36882, 50.26210, 44.63208, 44.15988, 46.48454, 52.98631, 54.22128, 51.49707, 51.06120, 50.55268, 47.68319, 46.84776, 49.71726, 53.78541, 49.53565, 45.39485, 50.08049, 47.75583, 46.33925, 48.26435, 50.95223, 51.38811, 49.78991, 49.24506, 51.02488)


[edit] result:

Scope of the function it to obtain a matrix which contains:
- every couple of DV[i] and FF[i] which are not both higher (or lower) than 50.
- their difference as third column.


example:

DV[1] = 55
FF[1] = 45

DV > 50 and FF < 50, so I report them in the matrix:

DV[1] -> matrix [1,1]
FF[1] -> matrix[1,2]

Третий столбец - их разница:

matrix[1,3] <- matrix[1,1] - matrix[1,2].

При DV[2] = 55 и FF[2] = 55 функция analyse() ничего не делает, потому что они оба больше 50.


person thetax    schedule 06.11.2016    source источник
comment
Чего вы ожидаете от таких вещей, как matrix <- matrix[-i]?   -  person IRTFM    schedule 06.11.2016
comment
Ведь это не работает? Не могли бы вы меня поправить?   -  person thetax    schedule 06.11.2016
comment
Ваш пример не полный. Вы не определили, какие DV или FF являются входными данными. Петли почти наверняка не нужны. А пробелы помогают сделать ваш код более читабельным.   -  person Pierre L    schedule 06.11.2016
comment
они оба являются двумя векторами длины 47. Мне не нужно делать это существенным, просто рабочий код.   -  person thetax    schedule 06.11.2016
comment
Код имеет неправильный отступ. Это нечитаемо. Никаких пробелов вокруг операторов, особенно <-. Пожалуйста, отредактируйте.   -  person Bhas    schedule 06.11.2016
comment
Пожалуйста, предоставьте образец ваших данных (DV, FF). Функция dput() из R делает это действительно простым   -  person ira    schedule 06.11.2016
comment
@Bhas отредактировал. Извините, я новичок: так лучше?   -  person thetax    schedule 06.11.2016
comment
@ira какая разница в данных? они оба являются двумя векторами длины 47.   -  person thetax    schedule 06.11.2016
comment
Предоставляя фактический полный пример. Если кто-то хочет помочь, он может сравнить ваш ответ со своим.   -  person Pierre L    schedule 06.11.2016
comment
@PierreLafortune Я добавил фактические значения для DV и FF.   -  person thetax    schedule 06.11.2016
comment
Что именно эта часть должна делать?: if(matrix[i,1]==0) {matrix<-matrix[-i] }   -  person ira    schedule 06.11.2016
comment
Вы почти там. Пожалуйста, добавьте результат, который analyze функция дала бы для этого примера. Спасибо за работу над улучшением вашего вопроса. Я уверен, что вы получите необходимую помощь.   -  person Pierre L    schedule 06.11.2016
comment
@ira удаляет все строки, содержащие нулевые значения. Я знаю, что это неэффективный способ, но на данный момент он работает. Я начинающий.   -  person thetax    schedule 06.11.2016
comment
Также может быть лучше создать пример с 10 значениями. Таким образом, вы можете сосредоточиться на правильной структуре. После этого вы можете расширить логику до 47.   -  person Pierre L    schedule 06.11.2016
comment
Боюсь, matrix[-i] делает что-то другое, чем вы думаете? Вы пробовали что-то вроде matrix[-i, ]   -  person ira    schedule 06.11.2016
comment
@ira да, я имел в виду [-i, ]. Это причина ошибки? Теперь я пытаюсь исправить это. Спасибо.   -  person thetax    schedule 06.11.2016
comment
Ваше описание противоположно тому, что делает ваша функция. Значения больше 50 обрабатываются функцией.   -  person Pierre L    schedule 06.11.2016


Ответы (1)


Вы можете заменить последний цикл for векторизованным решением:

analyse <- function(DV,FF)
{
  correct <- rep(0,47)
  matrix <- array(rep(0,47*3),dim=c(47,3))

  for(i in 1:47)
  {
    if( DV[i] > 50 ) { 
      if( FF[i] > 50) {
        correct[i] <- i 
      } 
    }

    else {
      if( FF[i] < 0) {
        correct[i] <- i}
    }
  }

  for(i in 1:47)
  {
    if( (correct[i] == 0) == FALSE)
    {
      matrix[i,1] <- DV[i]
      matrix[i,2] <- FF[i]
      matrix[i,3] <- matrix[i,1] - matrix[i,2]
    }
  }

  matrix <- matrix[ matrix[,1] != 0, ]

  return(matrix)
}

analyse(DV, FF)
#      [,1]     [,2]     [,3]
# [1,] 59.2 51.93295  7.26705
# [2,] 50.9 53.02263 -2.12263
# [3,] 57.8 50.98856  6.81144
# [4,] 51.6 52.36882 -0.76882
# [5,] 62.5 52.98631  9.51369
# [6,] 55.0 54.22128  0.77872
# [7,] 53.8 51.49707  2.30293
# [8,] 52.4 51.06120  1.33880
# [9,] 54.7 50.95223  3.74777
# [10,] 50.3 51.38811 -1.08811
# [11,] 52.0 51.02488  0.97512

Но, как вы упомянули, это неэффективно. Нет необходимости в петлях. Приведенная ниже функция обеспечивает идентичный вывод.

analyse2 <- function(DV, FF) {
  indx <- (DV > 50 & FF > 50) | FF < 0
  dif <- DV[indx] - FF[indx]
  matrix(c(DV[indx], FF[indx], dif), ncol=3)
}
analyse2(DV, FF)
#      [,1]     [,2]     [,3]
# [1,] 59.2 51.93295  7.26705
# [2,] 50.9 53.02263 -2.12263
# [3,] 57.8 50.98856  6.81144
# [4,] 51.6 52.36882 -0.76882
# [5,] 62.5 52.98631  9.51369
# [6,] 55.0 54.22128  0.77872
# [7,] 53.8 51.49707  2.30293
# [8,] 52.4 51.06120  1.33880
# [9,] 54.7 50.95223  3.74777
# [10,] 50.3 51.38811 -1.08811
# [11,] 52.0 51.02488  0.97512

all.equal(analyse(DV, FF), analyse2(DV, FF))
[1] TRUE

изменить

Основываясь на вашем описании, вы хотите, чтобы значения меньше 50 сообщались в матрицу, а не значения больше 50, как вы сделали в исходной функции. Это отредактированная функция с восклицательным знаком, добавленным во вторую строку.

analyse2 <- function(DV, FF) {
  indx <- (!DV > 50 & FF > 50) | FF < 0
  dif <- DV[indx] - FF[indx]
  matrix(c(DV[indx], FF[indx], dif), ncol=3)
}

analyse2(DV, FF)
#      [,1]     [,2]      [,3]
# [1,] 46.9 50.00784  -3.10784
# [2,] 42.7 52.51411  -9.81411
# [3,] 50.0 50.22578  -0.22578
# [4,] 47.8 50.29842  -2.49842
# [5,] 36.1 50.26210 -14.16210
# [6,] 44.5 50.55268  -6.05268
# [7,] 49.6 53.78541  -4.18541
# [8,] 44.7 50.08049  -5.38049

изменить 2

И то и другое больше или меньше 50.

analyse3 <- function(DV, FF) {
  indx <- !( (DV > 50 & FF > 50) | (DV < 50 & FF < 50) )
  dif <- DV[indx] - FF[indx]
  matrix(c(DV[indx], FF[indx], dif), ncol=3)
}
person Pierre L    schedule 06.11.2016
comment
Исходная функция имеет DV › 50 и FF › 50. В описании указаны значения, которые «не оба выше (или ниже) 50». Что приводит меня теперь к мысли, что это отрицание (DV > 50 & FF > 50) | (DV < 50 & FF < 50) - person Pierre L; 06.11.2016
comment
Да, мое описание было правильным, а мой код — нет. Большое спасибо, в том числе за оптимизированную функцию analyse2()! - person thetax; 06.11.2016
comment
О, мой плохой, я прочитал только уравнение в примере. Извиняюсь. - person ira; 06.11.2016
comment
Я добавил третий вариант с обоими меньшими или обоими большими. - person Pierre L; 06.11.2016