Повторное кодирование в R с использованием сложного утверждения - PullRequest
0 голосов
/ 02 ноября 2018

У меня есть данные генов 40000 строк (SNP) и 500 столбцов (людей), выглядящих как

AA AG GG GA AA
CC CG CC GC GG
AC CC CA CA CC

Пример, представляющий только 3 SNP и 5 человек.

Мне нужно преобразовать буквы в цифры, используя ключи, представленные далее. Обратите внимание, что три буквы A, C и G не могут встречаться в одном ряду. Только А и С или А и G, или С и G.

Если A представлено в строке, ключ:

AA = 0
AG =1
GG = 2
AC = 1
CC = 2

, если A не представлен, ключ:

CC = 0 
CG = 1 
GG = 2

Обратите внимание, что CC в одном случае - 2, в другом - 0.

Так пример будет выглядеть так:

0 1 2 1 0
0 1 0 1 2
1 2 1 1 2

Как это сделать в R для всех строк и столбцов?

Спасибо!

1 Ответ

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

Есть много способов решить эту проблему. Я бы создал индексный вектор для строк, которые сначала содержат A, а затем применил замены к различным строкам, используя функцию recode пакета dplyr.

# Creating the Matrix
X <- matrix(
  c("AA", "AG", "GG", "GA", "AA",
    "CC", "CG", "CC", "GC", "GG",
    "AC", "CC", "CA", "CA", "CC"), byrow=TRUE, nrow=3)

# Index
index_a <- apply(X, 1, function(i){
  any(grepl("A",i))
  })

# NA matrix for the result
Y <- matrix(NA_integer_, nrow(X), ncol(X))

# First replacement
Y[index_a, ] <- dplyr::recode(
  X[index_a, ],
  AA = 0L,
  AG = 1L,
  GG = 2L,
  AC = 1L,
  CC = 2L,
  GA = 1L,
  CA = 1L
)

# Second replacement
Y[!index_a, ] <- dplyr::recode(
  X[!index_a, ],
  CC = 0L, 
  CG = 1L, 
  GG = 2L,
  GC = 1L
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...