我在看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型等位基因副本的个体。我觉得我可能需要两个同时工作的ifelse
语句?
发布于 2014-08-16 22:21:51
编辑:你实际上不需要其他的或任何花哨的操作,除了加号和等于。
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中,通常如果数据是相同类型的,则将数据合并到矩阵/数据帧/等中更容易(而且速度更快),然后创建要在每一行/列/等上执行的函数。
要理解输出,请考虑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的数目。
https://stackoverflow.com/questions/25344490
复制相似问题