簡體   English   中英

R - 如何根據數據框中一行中的值創建列的子集

[英]R - How to make a subset of columns based on values in a row in a data frame

我有一個矩陣,我想分組並最終用於制作情節。 該數據是群體中每個患者的特定血液標記物的計數列表。 它看起來像這樣:

    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))

我想建立所有患者(第3-6列)的數據框,其類值為零(第1行),所有患者的第二個數據框的類值為1。

在過去,我使用子集函數根據列中的值選擇行,是否可以根據行中的值選擇列的子集?

我試過這個:

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

在數據上我然后能夠獲得包含所有行的數據框,並且只能獲得具有指示類的列。

您的數據也沒有很好的安排。 重塑它會更好。

如果沒有輸入數據,這只是一個猜測:

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)創建一個邏輯向量,對於前兩列和那些在第一行中為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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM