如果分类变量的频率低于定义值,则R重新编码变量

时间:2016-01-14 09:40:56

标签: r

以下是数据集(d)的示例:

rs3 rs4 rs5 rs6
1   0   0   0
1   0   1   0
0   0   0   0
2   0   1   0
0   0   0   0
0   2   0   1
0   2   NA  1
0   2   2   1
NA  1   2   1

要检查SNP基因型的频率(0,1,2),我们可以使用表命令

table (d$rs3)

输出为

0 1 2 
5 2 1

如果基因型2的频率<3,那么我们想要重新编码变量,重新编码的输出应该是

rs3 rs4 rs5 rs6
1   0   0   0
1   0   1   0
0   0   0   0
1   0   1   0
0   0   0   0
0   2   0   1
0   2   NA  1
0   2   1   1
NA  1   1   1

我有需要检查和重新编码的70000SNP。如何在R?

中使用for循环或其他方法

2 个答案:

答案 0 :(得分:3)

这是另一种可能的(矢量化)解决方案

indx <- colSums(d == 2, na.rm = TRUE) < 3 # Select columns by condition
d[indx][d[indx] == 2] <- 1 # Inset 1 when the subset by condition equals 2
d
#   rs3 rs4 rs5 rs6
# 1   1   0   0   0
# 2   1   0   1   0
# 3   0   0   0   0
# 4   1   0   1   0
# 5   0   0   0   0
# 6   0   2   0   1
# 7   0   2  NA   1
# 8   0   2   1   1
# 9  NA   1   1   1

答案 1 :(得分:2)

我们可以尝试

 d[] <- lapply(d, function(x) 
    if(sum(x==2, na.rm=TRUE) < 3) replace(x, x==2, 1) else x)
d
#   rs3 rs4 rs5 rs6
#1   1   0   0   0
#2   1   0   1   0
#3   0   0   0   0
#4   1   0   1   0
#5   0   0   0   0
#6   0   2   0   1
#7   0   2  NA   1
#8   0   2   1   1
#9  NA   1   1   1

或者可以在dplyr

中使用相同的方法
library(dplyr)
d %>%
    mutate_each(funs(if(sum(.==2, na.rm=TRUE) <3) 
                replace(., .==2, 1) else .))