2016-04-30 27 views
0

セルの値が1の各行の列名を取得しようとしています。データフレームの特定の行の値と一致する列名を取得

library(permute) 
set.seed(42) 
exampledf<- data.frame(allPerms(c(1,2,3,4))) 
exampledf<-head(exampledf) 

私はこれを試してみました:

apply(exampledf,2,function(x){ 
    ll<-x[1]==1 
    which(ll==T) 
    }) 

データセット

X1 X2 X3 X4 
1 1 2 4 3 
2 1 3 2 4 
3 1 3 4 2 
4 1 4 2 3 
5 1 4 3 2 
6 2 1 3 4 

私の目標:

X1 
X1 
X1 
X1 
X1 
X2 
+0

おっと、はい....最大[ '名(exampledf)のようなものを試してみてください – Rilcon42

+2

今の質問に固定。 col(exampledf == 1)] ' –

答えて

4

、これは一つの方法である:それは使用する必要はありませんので、

# construct sample data.frame 
set.seed(1234) 
df <- data.frame(matrix(
       c(sample(1:4, 4), sample(1:4, 4), 
        sample(1:4, 4), sample(1:4, 4)), 
       ncol=4, byrow=T)) 
# name data.frame 
names(df) <- c(paste0("x", 1:4)) 

# get names of variables 
names(df)[apply(df, 1, function(i) which(i == 1))] 

おそらく高速です@DavidArenburgによって提案された方法(特に大規模なデータセットのためには)

names(df)[which(df == 1, arr.ind=T)[, "col"]] 

ですapply機能です。

注:私はpermuteパッケージを持っていないので、別のdata.frameを構築しました。

+1

'を使うために' apply'を実行する必要はありません。ちょうど '名前(df)[(df == 1、arr.ind = TRUE)[、" col "]]'が行います。 –

+0

@DavidArenburgうわー。 arr.ind引数のもう一つの使い方。先端に感謝します。私はそれを私の答えに加えます。 – lmo

1

を私は右(最後にマッチしたいけないあなたの質問を願っています列はX3の代わりにX2ですか?)。ちょっと古い学校だけど、もしあなたが正しいとすれば、これはすべきだ。

library(permute) 
set.seed(42) 
exampledf <- data.frame(allPerms(c(1,2,3,4))) 
exampledf <- head(exampledf) 

matched_cols = c() 
for(i in 1:nrow(exampledf)){ 
    row <- edf[i, ] == 1 
    matched_col <- colnames(exampledf)[row == T] 
    matched_cols = c(matched_cols, matched_col) 
} 
matched_cols 
+0

Rやその他の言語でのオブジェクトの増加を避けることは、通常はお勧めします。塗りつぶしたいオブジェクトのサイズ(ここではデータフレームの行数に等しい)を知っているときは、そのサイズのベクトルをあらかじめ割り当ててデータを格納するほうがはるかに優れています。 'exampledf < - head ...'の下では、matched_colsのベクトルを 'matches_cols < - integer(nrow(exampledf))'に初期化する必要があります。 'matched_cols [i] < - ...'を使ってmatched_colsを記入し、反復ごとにmatched_colsを繰り返しコピーする手間を省くことができます。 – lmo

0

別の簡単な方法:

library(permute) 
set.seed(42) 
exampledf<- data.frame(allPerms(c(1,2,3,4))) 

for(i in 1:nrow(exampledf)){ 
    for (j in 1:length(exampledf[i,])){ 
     if(exampledf[i,j]==1){ 
      print(names(exampledf)[j]) 
     } 
    } 
} 

出力例である:

"X1"

"X1"

"X1"

"X1"

"X1"

"X2"

"X2"

"X3"

関連する問題