2012-02-29 3 views
7

名前付き行( 'a'と 'b')と名前付き列( '10'、 '20'、 '30'、 '40')の論理行列xがあります。これ、のは、言ってみましょう:R:行列の真の要素の行と列の名前を取得する方法は?

10 20 30 40 
a T F T F 
b F T F T 

structure(c(TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, TRUE), 
.Dim = c(2L, 4L), .Dimnames = list(c("a", "b"), c("10", "20", "30", "40"))) 

は、私は真の値を持つ行と列の名前をリストし、テーブルを取得するための短い方法はありますか?

row col 
a 1 1 
b 2 2 
a 1 3 
b 2 4 

を生成which(x, arr.ind = T)することによって得ることができる同様の

a 10, 30 
b 20, 40 

何か、しかし、私は本当に最初のテーブルを取得したい:それは私には、次の表を取得したいです。

答えて

11

applyを直接ご利用いただけます。

apply(
    x, 1, 
    function(u) paste(names(which(u)), collapse=",") 
) 
+2

+1: 'T(T(適用(M、1、機能(U)ペースト(名((U )))、collapse = "、"))))は要求された結果にさらに近く、さらに調整が行われます – Henry

2

あなたはこれを指定しませんでしたが、実際に結果が実際に長方形であると仮定することが望ましい出力になります。つまり、aに対しては3つの列名を取得せず、bに対しては2つの列名しか取得しないということです。

私は、少なくとも、これはあなたが始めるべきだと思う:

m <- structure(c(TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, TRUE), 
.Dim = c(2L, 4L), .Dimnames = list(c("a", "b"), c("10", "20", "30", "40"))) 

rr <- rownames(m)[row(m)[which(m)]] 
cc <- colnames(m)[col(m)[which(m)]] 

dd <- data.frame(rr = rr,cc = cc) 
dd 

必要な情報を返しますが、非矩形の場合に窒息しません安全な「長い」形式でいます。あなたはこのように指定されているように一度そこに、あなたはそれを再編成することができます:

library(plyr) 
ddply(dd,.(rr),function(x){ x$cc }) 

が、率直に言って、その最後のビットが、私は本当に醜い見つけ、そしてあなたは少し待っていれば、より良い解決策がポップアップする場合、私は驚かないだろう

0

あなたはtableオブジェクトがas.data.frame()で "長い" 形式のデータフレームに変換されているという事実に使用することができます。その結果dfは以下の通りです

# Create matrix of interest 
mat <- structure(c(TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, TRUE), .Dim = c(2L, 4L), .Dimnames = list(c("a", "b"), c("10", "20", "30", "40"))) 

# Convert to table, then to long data.frame 
df <- mat %>% as.table %>% as.data.frame(., stringsAsFactors=FALSE) 

を:

あなた
Var1 Var2 Freq 
1 a 10 TRUE 
2 b 10 FALSE 
3 a 20 FALSE 
4 b 20 TRUE 
5 a 30 TRUE 
6 b 30 FALSE 
7 a 40 FALSE 
8 b 40 TRUE 

TRUEの行だけをインデックスすることができます:

df <- df[df$Freq,1:2] %>% sort 
df 
     Var1 Var2 
    1 a 10 
    5 a 30 
    4 b 20 
    8 b 40 

あなたが望む正確にテーブルにこれを変換するdplyrを使用することができます。

library(plyr) 
ddply(df, "Var1", function(x) x$Var2) 
    Var1 V1 V2 
1 a 10 30 
2 b 20 40 
関連する問題