Michael
Michael

Reputation: 1575

Summary by Row of a Categorical Variable in R

I have the following matrix

coin.flip<-expand.grid(c("H","T"),c("H","T"),c("H","T"),c("H","T"))

> coin.flip
   Var1 Var2 Var3 Var4
1     H    H    H    H
2     T    H    H    H
3     H    T    H    H
4     T    T    H    H
5     H    H    T    H
6     T    H    T    H
7     H    T    T    H
8     T    T    T    H
9     H    H    H    T
10    T    H    H    T
11    H    T    H    T
12    T    T    H    T
13    H    H    T    T
14    T    H    T    T
15    H    T    T    T
16    T    T    T    T

I would like to get a row by row summary of the counts of H's and T's. I would also like a table of how many row's had 1 T, 2 T's, etc...

Thanks a lot! I've been searching for this answer for a little bit and haven't found anything yet.

Upvotes: 1

Views: 2571

Answers (3)

Henry
Henry

Reputation: 6784

Strictly coin.flip is a data.frame not a matrix.

You could use DWin's solution. Another approach is

> summary(t(coin.flip))
 V1    V2    V3    V4    V5    V6    V7    V8    V9    V10   V11   V12   V13   V14   V15   V16  
 H:4   H:3   H:3   H:2   H:3   H:2   H:2   H:1   H:3   H:2   H:2   H:1   H:2   H:1   H:1   T:4  
       T:1   T:1   T:2   T:1   T:2   T:2   T:3   T:1   T:2   T:2   T:3   T:2   T:3   T:3  

To get the table quickly, combine the answers from DWin and joran

> table(rowSums(coin.flip=="T"))

0 1 2 3 4 
1 4 6 4 1   

Upvotes: 1

IRTFM
IRTFM

Reputation: 263362

> coin.flip$total_H <- rowSums(coin.flip=="H")
> coin.flip
   Var1 Var2 Var3 Var4 total_H
1     H    H    H    H       4
2     T    H    H    H       3
3     H    T    H    H       3
4     T    T    H    H       2
5     H    H    T    H       3
....snipped
> table(coin.flip$total_H)

0 1 2 3 4 
1 4 6 4 1    

Total T's table is just
> table(4- coin.flip$total_H )

0 1 2 3 4 
1 4 6 4 1     # boringly similar to total H table

Upvotes: 4

joran
joran

Reputation: 173577

Here's an way using apply and then table:

rs <- t(apply(coin.flip,1,function(x){c(length(which(x=='H')),length(which(x=='T')))}))
table(rs[,2])

I transposed the results from apply since that's the way you probably expect them displayed.

Upvotes: 2

Related Questions