Образец последовательности в матрице R - PullRequest
0 голосов
/ 28 ноября 2018

У меня большая матрица

#  id    v1   v2   v3   v4   v5   v6   v7   v8
# 1001   37   15   30   37    4   11   35   37
# 2111   44   31   44   30   24   39   44   18
# 3121   43   49   39   34   44   43   26   24
# 4532   45   31   26   33   12   47   37   15
# 5234   23   27   34   23   30   34   23    4
# 6345   9    46   39   34    8   43   26   24

Я хотел бы определить последовательности, которые начинаются и заканчиваются одним и тем же номером.
Пример последовательности ниже:

Выход:

1001 [v1] to [v4] 37 to 37: 15,30
1001 [v4] to [v8] 37 to 37: 4, 11, 35
2111 [v1] to [v3] 44 to 44: 31 
2111 [v3] to [v7] 44 to 44: 30, 24, 39

Я хотел бы знать числа, следующие за 37, и частое число, которое предшествует 37, в данном случае - 15.

1 Ответ

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

Если вы хотите сделать это по строкам матрицы, вы можете использовать apply и указать, где в каждой строке находится число, равное желаемому (43 в вашем примере).Код выглядит следующим образом:

equal.43 = apply(mat==43,1,which)

Это даст вам список, где каждый элемент в списке соответствует каждой строке матрицы, и внутри этих элементов у вас будет номер столбца, который содержит значение.Например, представьте, что ваша матрица выглядит следующим образом:

     [,1] [,2] [,3] [,4]
[1,]    3    5   10   10
[2,]    7    5    6   10
[3,]   10    7    5    5
[4,]    6    8   10    9
[5,]    2    5    7   10

Затем вы запускаете команду:

where.is.7 = apply(x==7,1,which)

Если вы проверите где .is.7, вы увидите:

[[1]]
integer(0)

[[2]]
[1] 1

[[3]]
[1] 2

[[4]]
integer(0)

[[5]]
[1] 3

То есть 1-й ряд не имеет 7, 2-й ряд в 1-м столбце и т. Д.Оттуда вы можете перебрать список, чтобы определить, каких «соседей» вы хотите.Кроме того, перед циклом вы должны удалить любое значение столбца, что приведет к ошибке индексации за пределами границ.Например,

where.is.7 = lapply(where.is.7,function(x) x[x<4])
followers = c()
for(i in 1:5){

  if(length(where.is.7[[i]])>0){
    followers = cbind(followers,x[i,where.is.7[[i]]+1])
  }
}
...