2017-02-02 4 views
3

Редактировать Отмечено опечатка: minor 1 и hetero 1 равно два, не один, как было написано.Создание порядковой переменной из двух цифр

У меня есть набор генотипов, они кодируются двумя численными переменными (minorpos и heteropos), которые могут принимать 1 или 0 (наличие или отсутствие маркера). Я хочу сделать третью переменную, которая переводит эту информацию в порядковой переменной так:

  • минор 1 и гетеро 1 равно двум,
  • или минор 0 и гетеро 1 равен 1,
  • или минор 1 и hetero 0 равно 1,
  • или minor 0 и hetero 0 равно нулю и т. д.

Вот набор данных, чтобы начать:

id <- c(1,2,3) 
BDNF_minorpos <- c(0, 1, 0) 
BDNF_heteropos <- c(1,1,0) 
EGFR_minorpos <- c(0,0,1) 
EGFR_heteropos <- c(0,0,0) 

mydata<-data.frame(BDNF_minorpos, BDNF_heteropos, EGFR_minorpos, EGFR_heteropos) 

будет выглядеть следующим образом:

> data.frame(BDNF_minorpos, BDNF_heteropos, EGFR_minorpos, EGFR_heteropos) 
    BDNF_minorpos BDNF_heteropos EGFR_minorpos EGFR_heteropos 
1    0    1    0    0 
2    1    1    0    0 
3    0    0    1    0 

Я пытался создать функцию, чтобы сделать работу, но я борюсь с IfElse синтаксиса , Это первая функция Я создаю в R.

genotypesToOrdinals <- function(variables, data){ 
    for (i in variables) 
     var_minor <- paste(i, "_minorpos") 
     var_hetero <- paste(i, "_heteropos") 
     x<- ifelse((var_minor=0) & (var_hetero=0), 0, 
      ifelse(var_minor=0) & (var_hetero=1), 1, 
      ifelse(var_minor=1) & (var_hetero=0), 1, 
      ifelse(var_minor=1) & (var_hetero=1), 2) 
     data <- x 
    return (data) 
} 

Что я Тринг добиться того, чтобы передать имя переменных (p.ex. BDNF и EGFR), то функция должна Расположить BDNF_minorpos и BDNF_heteropos и создать новую переменную для хранения 0, 1 или 2. Она также должна обрабатывать NA, в случае, если она отсутствует, должна быть запись NA.

Я хотел бы вызвать функцию с:

genotypesToOrdinals(c("BDNF","EGFR"),mydata) 

До сих пор я получаю сообщение об ошибке:

Error in ifelse((var_minor = 0) & (var_hetero = 0), 0, ifelse(var_minor = 0) & : 
    unused arguments (1, ifelse(var_minor = 1) & (var_hetero = 0), 1, ifelse(var_minor = 1) & (var_hetero = 1), 2) 

Любая помощь будет оценена. Возможно, эта функция является излишней для такой простой задачи.

+0

Что касается конкретной ошибки, 'ifelse' принимает 3 аргумента. ваш «внутренний» 'ifelse' присваивается только одному:' ifelse (var_minor = 0) ' – SymbolixAU

ответ

4

Update, так как вопрос редактировать

Вы можете просто использовать rowSums на каждой строке.

genotypesToOrdinals <- function(variables, data){ 
    rowSums(data[, c(paste0(variables, c("_minorpos", "_heteropos")))]) 
} 


mydata$newBDNF <- genotypesToOrdinals("BDNF", mydata) 
mydata$newEGFR <- genotypesToOrdinals("EGFR", mydata) 


mydata 
# BDNF_minorpos BDNF_heteropos EGFR_minorpos EGFR_heteropos newBDNF newEGFR 
# 1    0    1    0    0  1  0 
# 2    1    1    0    0  2  0 
# 3    0    0    1    0  0  1 
+0

' paste0' векторизован кстати - 'paste0 (« BDNF », c (« _ minor »,« _ hetero »))' будет работать – thelatemail

+0

@thelatemail - да, конечно! спасибо – SymbolixAU

+0

Обратите внимание на редактирование в вопросе. –

3

Другое применение ?interaction:

stem <- c("BDNF","EGFR") 
ordfun <- function(data,stem) c(0,1,1,2)[interaction(data[paste(stem,c("minorpos","heteropos"),sep="_")])] 
mydata[paste(stem,"new",sep="_")] <- Map(ordfun, stem=stem, data=list(mydata)) 
mydata 
# BDNF_minorpos BDNF_heteropos EGFR_minorpos EGFR_heteropos BDNF_new EGFR_new 
#1    0    1    0    0  1  0 
#2    1    1    0    0  2  0 
#3    0    0    1    0  0  1 

Чтобы показать, почему это работает:

interaction(mydata[paste("BDNF",c("minorpos","heteropos"),sep="_")]) 
#[1] 0.1 1.1 0.0 
#Levels: 0.0 1.0 0.1 1.1 

c(0,1,1,2)[interaction(mydata[paste("BDNF",c("minorpos","heteropos"),sep="_")])] 
#[1] 1 2 0 
+0

обратите внимание на редактирование в вопросе. –

+0

Спасибо, интересный подход!результат от взаимодействия должен возвращаться неупорядоченным в соответствии с его описанием: «Результат« взаимодействия »всегда неупорядочен.« Должен ли я беспокоиться об этом? –

+1

@lf_araujo - я бы не стал беспокоиться об этом. Он всегда будет работать в указанном порядке. Если за несовершеннолетним следует функция hetero (как она есть), тогда она всегда должна быть правильной. – thelatemail

Смежные вопросы