私はテーブルを持っています、開始は以下です:
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
更新しました:
まず、colnames を変更します。2 番目のアンダースコアの前の部分だけが重要なので、たとえば Control_H1455_121005_4 では、Control_H1455 だけに短縮したいと考えています。これまでの私のコードは次のとおりです。
gsub("^.*?_","_","Case_H1455_121005_4")
しかし、これは を返します
"_H1455_121005_4"
。残しておきたい部分は実はCase_H1455
. したがって、 2番目のアンダースコアまですべての文字を維持したいだけです。更新: (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% が Case AND Control グループの両方で 0 を含んでいる。したがって、このサンプル テーブルでは、行を削除するには、グループ Control と Case にそれぞれ 0 を含む列の >=90% が含まれている必要があります。したがって、ここでは最後の行になります。ケース グループに含まれる列の 90% 以上が 0 であるが、コントロール グループの列の 90% 未満が 0 (またはその逆) である場合、その行を保持する必要があります。これを行うには、現在次のコードがあります。
data <- data[rowSums(data==0)/ncol(data) < 0.9, ]
ただし、これはケースとコントロールによって各行を分離し、各グループを個別に見るわけではありません。
また、実際のデータにはさらに多くの列と行があり、コントロールとケースは列から列へとランダムに表示されることに注意してください。
したがって、番号(1)に関するヘルプは大歓迎です!