2016-06-16 3 views
1

次の問題を解決する必要がありますが、それを理解できないようです... ケースの行の場合は、次のようなデータフレームの行名が必要ですOIL_BE_petのようなものは1に等しい。もちろん、元のデータはこれらの2列4列よりも大きい。各行には最大1つの「1」しかありません。データフレームに表示される順番にこれらの行の名前を使用したいと思います。行が1の場合の行名の選択

     OIL_BE_pet  OIL_BE_pet2 
Terminal One    0    0 
Terminal Two    1    0 
Terminal Three    0    1 
Terminal Four    0    0 

ここでの解決策は、「ターミナル2」、「ターミナル3」です。

ありがとうございます!

+4

'rownames(DF)[DF $ OIL_BE_petでwhichを使用することができます。

この

は結果を与えますDF $ OIL_BE_pet2] ' – Roland

+0

これはなぜ機能しますか?私が言ったように、実際のデータフレームにはもっと多くの列/行があります。また、論理演算子を使用していますが、この例のデータは数値です。 – nico

+2

Rは、論理的な比較を行うと自動的に数値を論理値に変換します。再現性のある代表的な例を提示しないと、自分の責任ではありません。たぶん、rownames(DF)[rowSums(DF)> 0] 'または' rownames(DF)[Reduce( "|"、DF)] 'でしょう。 – Roland

答えて

4

私はrowSums()を提案してもよい:

df[as.logical(apply(df,1,sum)),] 

:あなたは、次のコードを使用することができます

rownames(df)[rowSums(df)>0]; 
## [1] "Terminal Two" "Terminal Three" 

データ

df <- data.frame(OIL_BE_pet=c(0L,1L,0L,0L),OIL_BE_pet2=c(0L,0L,1L,0L),row.names=c(
'Terminal One','Terminal Two','Terminal Three','Terminal Four')); 
0

これは、行ごとに合計し、どの行が非ゼロの合計値を持つかを調べ、それらの行でデータフレームをサブセット化することによって機能します。 |

> df[as.logical(apply(df,1,sum)),] 
       OIL_BE_pet OIL_BE_pet2 
Terminal Two   1   0 
Terminal Three   0   1 
1

我々はarr.ind=TRUE

names(which(df!=0, arr.ind=TRUE)[,1]) 
#[1] "Terminal Two" "Terminal Three" 
関連する問題