2014-09-29 2 views
4

Я не уверен, как это сделать?Условные обозначения в R

Я хотел бы сделать новый столбец в dataframe зависит от того, или не отвечают две другие колонки следующие критерии:

если ДФ $ Cn_LCIS и DF $ Cn_ILC оба больше, чем «2» печать «0»

если ДФ $ CN_LCIS и DF $ Cn_ILC являются как меньше, чем '2' печать '0'

и если они одинаковы и печать '0' еще напечатать '1'

ф.р.

 Chromosome  Start  End Cn_ILC mCn_ILC Cn_LCIS mCn_LCIS both 
chr1.1  chr1   0 11194349  2  1  2  1 0 
chr1.2  chr1 102809740 104579163  2  1  3  1 1 
chr1.3  chr1 104579163 121311799  2  1  2  1 0 
chr1.4  chr1 11194349 11492125  2  1  3  1 1 
chr1.5  chr1 11492125 71442329  2  1  2  1 0 
chr1.6  chr1 144009053 157140292  1  1  1  1 0 
chr1.7  chr1 157140292 243709339  2  1  1  1 0 
chr1.8  chr1 243709339 244112662  3  1  3  1 0 
chr1.9  chr1 244112662 249250621  3  1  3  1 0 
chr1.10  chr1 71442329 72624878  2  1  3  1 1 
chr1.11  chr1 72624878 102809740  2  1  4  1 1 

Не работает:

df$both <- ifelse(df$Cn_LCIS > 2 & df$Cn_ILC > 2, 0, ifelse (df$Cn_LCIS < 2 & df$Cn_ILC < 2, 0, ifelse (df$Cn_LCIS == 2 & df$Cn_LCIS == 2, 0, ifelse(df$Cn_ILC!=df$Cn_LCIS,1)))) 
+0

за IfElse, смотрите здесь: HTTP: // stackoverflow.com/questions/16275149/does-ifelse-really-calculate-both-of-its-vectors-every-time-is-it-slow/16 275201 –

ответ

2
compareTo2 <- function(LCIS, ILC) { 
    as.numeric(!((LCIS > 2 & ILC > 2) | (LCIS < 2 & ILC < 2) | (LCIS == ILC))) 
} 

compareTo2(df$Cn_LCIS, df$Cn_ILC) 
# [1] 0 1 0 1 0 0 1 0 0 1 1 

Если данные велико, вы можете попробовать следующий

library(data.table) 

DT <- as.data.table(df) 

## different syntax for data.table than data.frame 
DT[, as.numeric(!((Cn_LCIS > 2 & Cn_ILC > 2) | (Cn_LCIS < 2 & Cn_ILC < 2) | (Cn_LCIS == Cn_ILC))) ] 

## ... or you can assign it as a column 
DT[, compare_LCIS_ILC := as.numeric(!((Cn_LCIS > 2 & Cn_ILC > 2) | (Cn_LCIS < 2 & Cn_ILC < 2) | (Cn_LCIS == Cn_ILC))) ] 
DT 
#   Chromosome  Start  End Cn_ILC mCn_ILC Cn_LCIS mCn_LCIS both compare_LCIS_ILC 
# 1:  chr1   0 11194349  2  1  2  1 0    0 
# 2:  chr1 102809740 104579163  2  1  3  1 1    1 
# 3:  chr1 104579163 121311799  2  1  2  1 0    0 
# 4:  chr1 11194349 11492125  2  1  3  1 1    1 
# 5:  chr1 11492125 71442329  2  1  2  1 0    0 
# 6:  chr1 144009053 157140292  1  1  1  1 0    0 
# 7:  chr1 157140292 243709339  2  1  1  1 0    1 
# 8:  chr1 243709339 244112662  3  1  3  1 0    0 
# 9:  chr1 244112662 249250621  3  1  3  1 0    0 
# 10:  chr1 71442329 72624878  2  1  3  1 1    1 
# 11:  chr1 72624878 102809740  2  1  4  1 1    1 
1

Проблема с кодом является то, что ваш сокровенном ifelse не имеет аргумента «else». Если вы просто добавите , 0 внутри самого внутреннего ifelse, ваш код будет запущен. Тад сказал, что ответ Рикардо Сапорты немного чище.

2

Или

transform(df, both = ifelse((Cn_LCIS > 2 & Cn_ILC > 2) | 
          (Cn_LCIS < 2 & Cn_ILC < 2) | 
           (Cn_LCIS == 2 & Cn_LCIS == 2), 0, 1)) 

#   Chromosome  Start  End Cn_ILC mCn_ILC Cn_LCIS mCn_LCIS both 
# chr1.1  chr1   0 11194349  2  1  2  1 0 
# chr1.2  chr1 102809740 104579163  2  1  3  1 1 
# chr1.3  chr1 104579163 121311799  2  1  2  1 0 
# chr1.4  chr1 11194349 11492125  2  1  3  1 1 
# chr1.5  chr1 11492125 71442329  2  1  2  1 0 
# chr1.6  chr1 144009053 157140292  1  1  1  1 0 
# chr1.7  chr1 157140292 243709339  2  1  1  1 1 
# chr1.8  chr1 243709339 244112662  3  1  3  1 0 
# chr1.9  chr1 244112662 249250621  3  1  3  1 0 
# chr1.10  chr1 71442329 72624878  2  1  3  1 1 
# chr1.11  chr1 72624878 102809740  2  1  4  1 1 
1

И еще одна возможность заключается в том, чтобы использовать with или within

with(df, { 
    cb <- cbind(Cn_LCIS, Cn_ILC) 
    aa <- (cb > 2) | (cb < 2) | (cb[1] == cb[2]) 
    (!(aa[,1] == aa[,2]))+0 
}) 
# [1] 0 1 0 1 0 0 1 0 0 1 1 
1

Более лаконично:

with(df, sign((Cn_LCIS-2)*(Cn_ILC-2))-(Cn_ILC != Cn_LCIS) < 0)*1 
# [1] 0 1 0 1 0 0 1 0 0 1 1 
Смежные вопросы