如何基于列名对行中的数据进行分类和操作

时间:2013-08-02 09:08:15

标签: r filter bioinformatics

我有一张桌子,起点如下:

                    Control_H1455_121005_4     Case_X1456_121005_1     Case_V1457_121005_7      Control_K1461_121005_2
ENSG00000419.8                     0                    0                    14                    3
ENSG00000457.8                     2                    0                    1                     0
ENSG00000460.11                    18                   3                    16                    6
ENSG00000938.7                     0                    0                    0                     0      

更新:

  1. 首先我要更改名称。只有第二个下划线之前的部分很重要,所以例如在Control_H1455_121005_4中,我想将它缩短为Control_H1455。到目前为止,这是我的代码:

    gsub("^.*?_","_","Case_H1455_121005_4")
    

    但这会返回"_H1455_121005_4"。我想要保留的部分实际上是Case_H1455。所以我只想保留所有角色,直到第二下划线

    更新:对于(2),我有以下代码:

    #separating data into Control & Case groups
    data_con=data[which(substring(names(data),2,2) %in% c("o"))]
    data_case=data[which(substring(names(data),2,2) %in% c("a"))]
    
    #delete rows if both case and control groups have >= 90% cols that contain 0
    #data <- data[(rowSums(data_case==0)/ncol(data_case) < 0.9 & rowSums(data_con==0)/ncol(data_con) < 0.9) , ]
    

    似乎有效。

  2. 我想过滤每一行并将该行中的数据分成两组:Control和Case。然后,我想删除一行,当且仅当它满足以下条件时:>&gt; = 90%的cols在Case AND 控制组中都包含0。因此,在此示例表中,为了删除行,Control和Case组必须包含&gt; = 90%的包含0的col。所以这里它是最后一行。如果案例组包含&gt; = 90%的cols为0但是Control组的&lt; 90%cols为0(反之亦然),则应该保留该行。为此,我目前有以下代码:

    data <- data[rowSums(data==0)/ncol(data) < 0.9, ]
    

    但是这并没有按Case和Control分隔每一行,而是单独查看每个组。

  3. 请记住,实际数据中还有更多cols和rows,Control和Case从col到col随机出现。

    所以对数字(1)的任何帮助都将不胜感激!

1 个答案:

答案 0 :(得分:1)

我不确定,但我认为这可能会有所帮助......

# 1)
# assuming that the structure of "_" does not change
colnames(data) <- sapply(colnames(data),
                         function(x){
                            paste(unlist(strsplit(x, "_"))[1:2], collapse = "_")
                                          })
# 2)
# to sperate case and control
ind <- grepl("Case", colnames(data))

# assuming that there are at lesast tow cases and tow control
# otherwise use sum and length
data[rowSums(data[, !ind]==0)/ncol(data[, !ind]) < 0.9 &
     rowSums(data[,  ind]==0)/ncol(data[,  ind]) < 0.9, ]

H个