0

我有一张桌子,开始如下:

                    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. 首先,我想更改 colnames。只有第二个下划线之前的部分很重要,例如在 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. 我想过滤每一行并将该行中的数据分为两组:控制和案例。然后,当且仅当它满足以下条件时,我想删除一行:> = 90% 的 cols 在 Case AND Control 组中都包含 0。所以在这个示例表中,为了删除一行,Control 和 Case 组必须各自包含 >=90% 的包含 0 的列。所以这里是最后一行。如果 Case 组包含 >=90% 的 cols 为 0,但 Control 组的 cols <90% cols 为 0(反之亦然),则应保留该行。为此,我目前有以下代码:

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

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

请记住,实际数据中有更多的列和行,并且控制和大小写随机出现在列之间。

因此,我们将不胜感激对数字 (1) 的任何帮助!

4

1 回答 1

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, ]

Hth

于 2013-08-02T11:14:15.643 回答