Построить матрицу, чтобы определить пошаговое изменение целых чисел для вектора - PullRequest
2 голосов
/ 07 мая 2019

Я хотел бы построить матрицу, которая записывает изменение от одного целочисленного значения к другому для вектора.

Пример вектора

a <- c(NA,1,3,4,2,6,5,3,7,7,NA,3,NA,5,5,NA,2,3,1,4)

Концептуальная матричная конструкция

Где я буду каждый раз подсчитывать значение в векторе a изменяется (или не изменяется) с одно целое число на другое.

               To
         1 2 3 4 5 6 7
       1
       2
       3
From   4
       5
       6
       7

Желаемый вывод

Обратите внимание, что NA имеет значение.Например, 7,NA,3 в a не считается from 7 to 3.

              To
         1 2 3 4 5 6 7
       1 0 0 1 1 0 0 0
       2 0 0 1 0 0 1 0
       3 1 0 0 1 0 0 1
From   4 0 1 0 0 0 0 0
       5 0 0 1 0 1 0 0
       6 0 0 0 0 1 0 0
       7 0 0 0 0 0 0 1

Ответы [ 3 ]

4 голосов
/ 07 мая 2019

Использование table

table(dplyr::lag(a),a)
   a
    1 2 3 4 5 6 7
  1 0 0 1 1 0 0 0
  2 0 0 1 0 0 1 0
  3 1 0 0 1 0 0 1
  4 0 1 0 0 0 0 0
  5 0 0 1 0 1 0 0
  6 0 0 0 0 1 0 0
  7 0 0 0 0 0 0 1
2 голосов
/ 07 мая 2019

Опция с tidyverse

library(tidyverse)
tibble(a, a1 = lag(a)) %>% 
   dplyr::count(a, a1) %>% 
   filter(!is.na(a), !is.na(a1)) %>% 
   spread(a1, n, fill = 0) %>% 
   column_to_rownames('a')
#  1 2 3 4 5 6 7
#1 0 0 1 0 0 0 0
#2 0 0 0 1 0 0 0
#3 1 1 0 0 1 0 0
#4 1 0 1 0 0 0 0
#5 0 0 0 0 1 1 0
#6 0 1 0 0 0 0 0
#7 0 0 1 0 0 0 1
2 голосов
/ 07 мая 2019
dict = sapply(2:length(a), function(i) toString(a[(i-1):i]))
unq = sort(unique(a))
+t(sapply(unq, function(x) sapply(unq, function(y) toString(c(x, y)) %in% dict)))
#     [,1] [,2] [,3] [,4] [,5] [,6] [,7]
#[1,]    0    0    1    1    0    0    0
#[2,]    0    0    1    0    0    1    0
#[3,]    1    0    0    1    0    0    1
#[4,]    0    1    0    0    0    0    0
#[5,]    0    0    1    0    1    0    0
#[6,]    0    0    0    0    1    0    0
#[7,]    0    0    0    0    0    0    1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...