在R中的条件语句

4

我不确定如何使这起作用?

我希望在一个数据框中创建一个新的列,取决于另外两个列是否符合以下条件:

如果 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))))

关于ifelse,请看这里:https://dev59.com/fGQo5IYBdhLWcg3wKcrH#16275201 - Ricardo Saporta
5个回答

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

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
你的代码问题在于最内层的ifelse没有"else"参数。如果你在最内层的ifelse里添加, 0,你的代码就能运行了。尽管如此,其他答案更简洁。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接