如果它低于同一列中最后一行的值,则删除r中的行

时间:2014-01-06 04:59:33

标签: r

我是r的初学者,并尝试删除所有行,其中包含的值小于"控件"或每列中的最后一行。对于此示例数据:

        A   B   C   D    E
gene1   14  6   8   16  14
gene2   5   6   10  6   4
gene3   2   4   6   3   4
gene4   26  6   18  39  36
gene5   1   2   3   1   2
gene6   2   1   3   1   1
control 8   5   5   4   11

我想删除所有低于控件(包括控件)的行,导致:

gene1   14  6   8   16  14
gene4   26  6   18  39  36

提前谢谢!! (对不起,我不知道如何发布这个问题。希望你能理解我的意思。)

2 个答案:

答案 0 :(得分:3)

这样就无法删除data.frame中的任何内容。您只能子集一个data.frame。然后,您可以将此子集分配给任何变量。首先初始化data.frame:

df <- read.table(text = "
        A   B   C   D    E
gene1   14  6   8   16  14
gene2   5   6   10  6   4
gene3   2   4   6   3   4
gene4   26  6   18  39  36
gene5   1   2   3   1   2
gene6   2   1   3   1   1
control 8   5   5   4   11
", header = TRUE)

现在,在矩阵上进行操作变得更容易,并进行转置。然后就像它一样简单:

m <- t(as.matrix(df))
df[apply(m > m[,'control'], 2, all),]

#       A B  C  D  E
# gene1 14 6  8 16 14
# gene4 26 6 18 39 36

首先,比较所有矩阵元素(m > m[,'control']),然后按行执行all(逻辑AND)操作(sensu df,实际上它是由转置的列完成的矩阵)。最后,您将df

分组

答案 1 :(得分:1)

这是解决方案。

coolFun<-function(dat,control_vec){ #alternatively you can remove control_vec from here
    aux<-c()
    for(i in 1:nrow(dat)) # iterate to nrow(dat)-1 only
        if(all(dat[i,]>control_vec)==TRUE) #and change it with dat[nrow(dat),]
            aux<-rbind(aux,dat[i,])
    }
    aux
}