![](/img/trans.png)
[英]how to subset a data frame based on two consecutive column values in a row in 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.