我有一张桌子,起点如下:
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
更新:
首先我要更改名称。只有第二个下划线之前的部分很重要,所以例如在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) , ]
似乎有效。
我想过滤每一行并将该行中的数据分成两组: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分隔每一行,而是单独查看每个组。
请记住,实际数据中还有更多cols和rows,Control和Case从col到col随机出现。
所以对数字(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个