2017-04-12 25 views
0

我正在嘗試提取標記包含單個TRUE值的行的rowname。請看下面的例子。提取包含TRUE FALSE的唯一組合的行的rowname

    Col1 Col2 Col3 
Npat    FALSE TRUE FALSE 
Ttc30a1   TRUE FALSE FALSE 
Gga1    TRUE TRUE TRUE 
Gga3    FALSE FALSE FALSE 
Gga2    FALSE FALSE TRUE 

我想提取包含一個唯一的「真」值的行的rownames並保留有關該列中的真正價值是信息 所需的輸出可能看起來像:

    Col1 Col2 Col3 
Npat    FALSE TRUE FALSE 
Ttc30a1   TRUE FALSE FALSE 
Gga2    FALSE FALSE TRUE 

我試圖使用grep和-grep,但無法識別多列中的多個值。我確信有一個簡單的方法可以做到這一點,但我還沒有找到。

+0

你的問題很容易,但考慮到提供重複的例子,如果可能的話:http://stackoverflow.com/questions/5963269/how-to- make-a-great-r-reproducible-example –

+0

該帖子的標題有誤導性。 – zx8754

回答

2

你可以簡單地對待布爾值,就好像它們是數字一樣。 在基R:

df[with(df, Col1 + Col2 + Col3 == 1) ,] 
+0

想象一下100列。 – zx8754

+0

在這種情況下,請與其他答案之一。 – hdkrgr

1

有些類似的方法:(更通用的解決方案)

使用apply總結逐行。

df[apply(df,1,sum)==1,] 
2

或者你可以使用rowSums(df)==1

df1 <-read.table(text="Row Col1 Col2 Col3 
Npat    FALSE TRUE FALSE 
Ttc30a1   TRUE FALSE FALSE 
Gga1    TRUE TRUE TRUE 
Gga3    FALSE FALSE FALSE 
Gga2    FALSE FALSE TRUE",header=TRUE, row.names=1,stringsAsFactors=FALSE) 

df1[rowSums(df1)==1,] 

     Col1 Col2 Col3 
Npat FALSE TRUE FALSE 
Ttc30a1 TRUE FALSE FALSE 
Gga2 FALSE FALSE TRUE