2013-04-28 8 views
10

行列(as.matrix)では、行が行列の行と等しいテーブルを生成するにはどうすればよいですか?行列の行ごとのテーブル

>table(matrix) 

>hist(matrix) 

行列内の各一意のデータ値の累積和を示し、私は行が各行列の行と同じ値であるテーブルを希望し、表の列であります行列内の各固有のデータ値の合計発生。

例行列:

1 2 3 4 
a 5 5 4 6  
b 5 5 5 5  
c 8 7 6 6 
d 2 6 6 6  
e 7 7 5 4  

所望の出力テーブル:

2 4 5 6 7 8 
a 0 1 2 1 0 0 
b 0 0 4 0 0 0 
c 0 0 0 2 1 1 
d 1 0 0 3 0 0 
e 0 1 1 0 2 0 
+1

二つがあります。私よりはるかに効率的でエレガントです。私の答えからチェックマークを外し、代わりに他のもの(例えば@GregoryDe​​min 's)に置くことを検討したいかもしれません –

答えて

8

1つの選択肢は、あなたのmatrixは(stackを使用して)長いdata.frameに変換することです簡単に使用するtable

あなたのデータは:

mymat <- structure(c(5L, 5L, 8L, 2L, 7L, 5L, 5L, 7L, 6L, 7L, 4L, 5L, 6L, 
      6L, 5L, 6L, 5L, 6L, 6L, 4L), .Dim = c(5L, 4L), .Dimnames = list(
       c("a", "b", "c", "d", "e"), c("1", "2", "3", "4"))) 

これは、長いdata.frameとして次のようになります。

head(stack(data.frame(t(mymat)))) 
# values ind 
# 1  5 a 
# 2  5 a 
# 3  4 a 
# 4  6 a 
# 5  5 b 
# 6  5 b 

ここで私たちは、あなたがしたいテーブルを作成するためにそれを使用することができます方法は次のとおりです。

with(stack(data.frame(t(mymat))), table(ind, values)) 
# values 
# ind 2 4 5 6 7 8 
# a 0 1 2 1 0 0 
# b 0 0 4 0 0 0 
# c 0 0 0 2 1 1 
# d 1 0 0 3 0 0 
# e 0 1 1 0 2 0 
+1

非常にいい!私はこのソリューションが私が提案したものよりはるかに多く –

2

あなたが行の上にapplyを使用して、あなたの行列を取り戻すためにifelse文でmapplyを使用することができます。 Xを想定し

はあなたの行列である:

# this will get you the values, just not in a nice matrix 
tables.list <- apply(X, 1, table) 

# unique values 
vals <- sort(unique(c(X))) 

# this will get you the matrix 
results <- t(mapply(function(v, t) 
    ifelse(v %in% names(t), t[as.character(v)], 0), list(vals), tables.list)) 

# give it names 
dimnames(results) <- list(rownames(X), vals) 

results 

# 2 4 5 6 7 8 
# a 0 1 2 1 0 0 
# b 0 0 4 0 0 0 
# c 0 0 0 2 1 1 
# d 1 0 0 3 0 0 
# e 0 1 1 0 2 0 
+0

非常にありがとう、これは非常に有用でした! – TallTree

+0

@TallTree、まったく問題ありません。助けてうれしい –

3

は、私があまりにもapplyを使用:することができます、その時点で

t(apply(mat, 1, function(x) table(factor(x, levels = unique(sort(c(mat))))))) 

R > mat = matrix(sample(1:8, 20, replace = T), 5, 4) 
R > mat 
    [,1] [,2] [,3] [,4] 
[1,] 5 6 1 4 
[2,] 4 3 4 8 
[3,] 4 8 4 3 
[4,] 3 3 5 1 
[5,] 1 1 3 1 
R > t(apply(mat, 1, function(x) table(factor(x, levels = unique(sort(c(mat))))))) 
    1 3 4 5 6 8 
[1,] 1 0 1 1 1 0 
[2,] 0 1 2 0 0 1 
[3,] 0 1 2 0 0 1 
[4,] 1 2 0 1 0 0 
[5,] 3 1 0 0 0 0 
7
## source data 
x=as.matrix(read.table(text=" 
    1 2 3 4 
a 5 5 4 6  
b 5 5 5 5  
c 8 7 6 6 
d 2 6 6 6  
e 7 7 5 4 
")) 

# result 

table(rep(rownames(x),ncol(x)),c(x)) 

# 2 4 5 6 7 8 
# a 0 1 2 1 0 0 
# b 0 0 4 0 0 0 
# c 0 0 0 2 1 1 
# d 1 0 0 3 0 0 
# e 0 1 1 0 2 0 
+0

+1非常にいいです。全く明白ではありませんが、非常にエレガントです。 –

+0

うわー、エレガント。 +1! –

関連する問題