2014-09-29 33 views
4

我不知道如何使这项工作?条件在R

我希望做一个数据帧的新列依赖于其他两列是否满足以下条件:

如果DF $ Cn_LCIS和DF $ Cn_ILC都大于“2”打印“0”

如果DF $ CN_LCIS和DF $ Cn_ILC均小于 '2' 打印 '0'

,如果它们是相同的同时打印 '0' 否则打印 '1'

DF

 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 – 2014-09-29 20:27:38

回答

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没有“其他”参数。如果您只在最里面的ifelse内添加, 0,您的代码将运行。 Thad说,@Ricardo Saporta的答案是一点清洁剂。

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

而另一种可能是使用withwithin

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