web-dev-qa-db-ja.com

R-データフレームの行の値に基づいて列のサブセットを作成する方法

サブセットを作成し、最終的にはプロットを作成するために使用する行列があります。データは、母集団内の各患者の特定の血液マーカーのカウントのリストです。次のようになります。

_    df <- data.frame(MarkerID=c("Class","A123","A124"),
             MarkerName=c("","X","Y"),
             Patient.1=c(0,1,5),
             Patent.2=c(1,2,6),
             Patent.3=c(0,3,7),
             Patient.4=c(1,4,8))
_

クラス値がゼロ(1行目)であるすべての患者(列3〜6)のデータフレームと、クラス値が1であるすべての患者の2番目のデータフレームを作成します。

過去に、サブセット関数を使用して列の値に基づいて行を選択しましたが、行の値に基づいて列のサブセットを選択することはできますか?

私はこれを試しました:

_x <- subset(data, data[1,] == 0)
_

ただし、dim(x)を実行すると、列数はdim(data)と同じですが、行数が異なります。これを行1の値が0である列だけを返すようにする方法についてのアイデアはありますか?

ローランド、はい。あなたは例ですdfはデータフレームがどのように見えるかです。データフレームに約30,000のマーカーと400を超える患者がいるため、dput(head(data))を投稿しませんでした。形を変えるヒントをありがとう、私はそれを試してみるつもりです。

あなたのサンプルコードは、行に基づいて列をサブセット化するために機能しました

_data[,c(TRUE,TRUE,data[1,-(1:2)]==1)]
_

次に、データについて、指定されたクラスを持つすべての行と列のみを含むデータフレームを取得できました。

12
jeran stratford

あなたのデータは良い方法で配置されていません。形を変えた方がいいです。

入力データがない場合、これは単なる推測です。

_df <- data.frame(MarkerID=c("Class","A123","A124"),
                 MarkerName=c("","X","Y"),
                 Patient.1=c(0,1,5),
                 Patent.2=c(1,2,6),
                 Patent.3=c(0,3,7),
                 Patient.4=c(1,4,8))

#  MarkerID MarkerName Patient.1 Patent.2 Patent.3 Patient.4
#1    Class                    0        1        0         1
#2     A123          X         1        2        3         4
#3     A124          Y         5        6        7         8

df[,c(TRUE,TRUE,df[1,-(1:2)]==0)]

#  MarkerID MarkerName Patient.1 Patent.3
#1    Class                    0        0
#2     A123          X         1        3
#3     A124          Y         5        7
_

ここでc(TRUE,TRUE,df[1,-(1:2)]==0)は、最初の2つの列と最初の行に0がある列のTRUEである論理ベクトルを作成します。次に、このベクトルに基づいて列をサブセット化します。

_df[,c(TRUE,TRUE,df[1,-(1:2)]==1)]

#  MarkerID MarkerName Patent.2 Patient.4
#1    Class                   1         1
#2     A123          X        2         4
#3     A124          Y        6         8
_

これにより、データがより一般的な形式(統計ソフトウェアの場合)に再形成されます。

_library(reshape2)  
df2 <- merge(melt(df[1,],variable.name="Patient",value.name="class")[-(1:2)],
             melt(df[-1,],variable.name="Patient"),all=TRUE)

#    Patient class MarkerID MarkerName value
#1  Patent.2     1     A123          X     2
#2  Patent.2     1     A124          Y     6
#3  Patent.3     0     A123          X     3
#4  Patent.3     0     A124          Y     7
#5 Patient.1     0     A123          X     1
#6 Patient.1     0     A124          Y     5
#7 Patient.4     1     A123          X     4
#8 Patient.4     1     A124          Y     8
_

次に、subsetを使用できます。

_subset(df2,class==0)

#    Patient class MarkerID MarkerName value
#3  Patent.3     0     A123          X     3
#4  Patent.3     0     A124          Y     7
#5 Patient.1     0     A123          X     1
#6 Patient.1     0     A124          Y     5
_
12
Roland