我在看10个人的基因。这个基因有两个等位基因,比如a
和b
。每个等位基因有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
个语句?
答案 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的数量。