Как добавить сумму строк таблицы или матрицы в R? - PullRequest
0 голосов
/ 12 ноября 2018

У меня есть матрица в R, которая выглядит следующим образом:

     [,1] [,2] [,3] [,4]
[1,]    0   1     1    1
[2,]    2   12   22   32
[3,]    3   13   23   33
[4,]    4   14   24   34
[5,]    5   15   25   35
[6,]    6   16   26   36
[7,]    7   17   27   37
[8,]    8   18   28   38
[9,]    9   19   29   39
[10,]   10   20   30   40

Я хочу добавить каждые две строки вместе, чтобы [1,] и [2,], создать новыйвектор (скажем, A).Мне нужно делать это повторно (так что тогда [3,] и [4,] и т. Д.).Мне нужно сделать это в цикле или другим способом, если это возможно (мои фактические данные имеют 49 столбцов и 1000 строк).Если возможно, я бы хотел создать новую матрицу со всеми новыми данными, поэтому из моих исходных данных у меня будет 500 строк, или здесь 5 строк?

Я пробовал следующий код:

 dips = matrix()
 X <- seq(1, by = 2, len = 1000)
 for(i in X)
 {
 dips[i] = population[i,] + population[i+1,]
}

Я получаю предупреждение: «Количество заменяемых элементов не кратно длине замены».И полученные данные не содержат все 49 столбцов.

Извините, если это основной вопрос или он уже решен, я новичок.Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

В будущем обязательно предоставьте минимальный воспроизводимый пример ваших данных, чтобы нам было легче им следовать! Вы можете показать, как вы создали фиктивные данные (см. Мой пример ниже) или использовать что-то вроде dput() для создания текстовой версии данных.

Есть несколько вещей, которые я замечаю:

  1. Вам нужно сделать выходную матрицу подходящего размера, если вы собираетесь добавлять по ссылке таким образом. Так что-то вроде matrix(nrow = 500, ncol = 49)
  2. Если у вас есть 1000 строк, и вы хотите добавить друг друга вместе, вы на самом деле хотите сделать сложение только 500 раз. Ваш X имеет длину 1000, поэтому он попытается найти строки, которые превышают самый большой индекс строки в population. Взгляните на tail(X), и вы увидите, что он длится до 1999 года.
  3. Наконец, вы пересекаете вектор каждого другого числа (1, 3, 5 и т. Д.), А также используете его в качестве индекса строки, так что матрица, которую вы пытаетесь заполнить, будет иметь пустые строки каждый раз, что Я не думаю, что вы хотите. (Поправь меня, если я ошибаюсь).

Вот небольшой пример с некоторыми фиктивными данными, которые я сделал. Заметные изменения по сравнению с вашим примером заключаются в том, что я:

  1. Сделано, чтобы выходная матрица имела желаемое количество строк и столбцов (такое же количество столбцов, как у population и вдвое меньше строк)
  2. Сделано X вдвое длиннее nrow(population)
  3. Используйте 1:length(X) вместо 1:X в моем цикле for

Пример:

population <- matrix(1:400, byrow = F, ncol = 4)

sum <- matrix(nrow = nrow(population)/2, ncol = 4)
X <- seq(1, by = 2, len = nrow(population)/2)
for (i in 1:length(X)){
  sum[i,] <- population[ X[i] ] + population[ X[i]+1 ]
}
0 голосов
/ 12 ноября 2018

Это, вероятно, дубликат, но я не смог быстро найти отличное совпадение, так что здесь ... вы можете использовать rowsum:

my_matrix <- structure(c(0L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 1L, 12L, 
                         13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 1L, 22L, 23L, 24L, 25L, 
                         26L, 27L, 28L, 29L, 30L, 1L, 32L, 33L, 34L, 35L, 36L, 37L, 38L, 
                         39L, 40L), .Dim = c(10L, 4L), .Dimnames = list(NULL, NULL))

rowsum(my_matrix, as.integer(gl(nrow(my_matrix), 2, nrow(my_matrix))))
#   [,1] [,2] [,3] [,4]
# 1    2   13   23   33
# 2    7   27   47   67
# 3   11   31   51   71
# 4   15   35   55   75
# 5   19   39   59   79
...