R中的ifelse陈述

时间:2014-08-16 22:16:05

标签: r logical-operators

我在看10个人的基因。这个基因有两个等位基因,比如ab。每个等位基因有3种形式:2型,3型或4型。

a <- c(2, 2, 2, 2, 3, 3, 3, 2, 4, 3)
b <- c(4, 2, 3, 2, 4, 2, 3, 4, 4, 4)

我希望编写一个变量来告诉我这个人有多少4个等位基因:0,1或2.

var <- ifelse(a==4 & b==4, 2, 0)

上面的代码不起作用,因为我没有考虑只有一个4型等位基因拷贝的个体。我觉得我可能需要同时工作的2 ifelse个语句?

1 个答案:

答案 0 :(得分:1)

编辑:你实际上并不需要ifelse或除了plus之外的任何花哨操作。等等。

var <- (a == 4) + (b == 4)

如果您设置为ifelse,则可以使用

完成此操作
var <- ifelse(a == 4, 1, 0) + ifelse(b == 4, 1, 0)

但是,我更喜欢使用apply的以下解决方案。以下将给出三种情况,结果是该人的数量为4(假设每一行都是一个人)。

a = c(2, 2, 2, 2, 3, 3, 3, 2, 4, 3)
b = c(4, 2, 3, 2, 4, 2, 3, 4, 4, 4)

d <- cbind(a,b)

apply(d, 1, function(x) {sum(x == 4)})

对于这个操作,我首先将两个向量组合成一个矩阵,因为它使得应用函数更容易。在R中,通常如果数据是相同类型,则更容易(并且计算机更快)将数据组合到矩阵/数据帧/等中,然后创建要在每个行/列/等上执行的函数。 / p>

要了解输出,请考虑d的第一行会发生什么。

> d[1, ]
a b 
2 4

> d[1, ] == 4
a     b 
FALSE  TRUE

布尔值在加法时被解释为整数,所以

> FALSE + TRUE
[1] 1

4是来自a还是b似乎并不重要,所以最终有三种情况:0,1和2,具体取决于4的数量。