R中的条件替换

时间:2015-09-06 15:42:52

标签: r bioinformatics

我在R中有一个如下所示的数据框:

Genes       snps    X0  X1  X2  X3  
2   WASH7P  1_14677 0   2   2   2   
3   WASH7P  1_14684 0   1   2   0   
4   WASH7P  1_14685 0   0   0   0    

是否可以进行条件替换,使得如果int 2的频率为>在X0-X3列中用0.5代替0代表0和0代替2? 这样新的数据帧是:

    Genes     snps  X0  X1  X2  X3  
2   WASH7P  1_14677 2   0   0   0   
3   WASH7P  1_14684 0   1   2   0   
4   WASH7P  1_14685 0   0   0   0    

提前致谢!

2 个答案:

答案 0 :(得分:5)

使用R,我们可以为以' X'开头的列名创建索引。 (' I1&#39)。然后,我们根据' X'中值为rowMeans的条件得到行索引。列大于0.5。我们将' df1'根据行/列索引,循环遍历列(lapply(...),然后替换' 2'值为' 0'和' 0'用' 2'使用recode中的library(car)。将输出分配回' df1'。

的行/列子集
library(car)
i1 <- grep('^X', names(df1))
i2 <- rowMeans(df1[i1]==2)> 0.5
df1[i1][i2,] <- lapply(df1[i1][i2,], recode, '2=0;0=2')
df1
#   Genes    snps X0 X1 X2 X3
#2 WASH7P 1_14677  2  0  0  0
#3 WASH7P 1_14684  0  1  2  0
#4 WASH7P 1_14685  0  0  0  0

数据

df1 <- structure(list(Genes = c("WASH7P", "WASH7P", "WASH7P"),
snps = c("1_14677", 
"1_14684", "1_14685"), X0 = c(0L, 0L, 0L), X1 = c(2L, 1L, 0L), 
X2 = c(2L, 2L, 0L), X3 = c(2L, 0L, 0L)), .Names = c("Genes", 
"snps", "X0", "X1", "X2", "X3"), class = "data.frame",
row.names = c("2", "3", "4"))

答案 1 :(得分:2)

另一种可能的方法:

cbind(df[1:2], t(as.data.frame(apply(df[3:ncol(df)], 1, function(x) {
  if(mean(x == 2) > .5) {
    x[x==0] <- 4
    x - 2} else x}))))
#   Genes    snps X0 X1 X2 X3
#2 WASH7P 1_14677  2  0  0  0
#3 WASH7P 1_14684  0  1  2  0
#4 WASH7P 1_14685  0  0  0  0

在函数内部,4已分配给0值。然后从行中减去2,留下所需的输出。

如果数据框的名称结构发生变化,请使用@ akrun的列搜索方法。或者,如果20只是玩具示例而且重新编码要复杂得多,请使用akrun的价值规范答案。这只是没有包的另一种方法。