2016-06-27 12 views
3

私は以下のようなデータフレームを持っています。文字列中の文字をrでグループ単位で数える方法は?

ID<-c('001','002','003','004','005') 
TYPE<-c('ABB','BCC','AAA','BBA','BCC') 
Group<-c('1','2','2','2','1') 
df<-data.frame(ID,TYPE,Group) 
df 

    ID TYPE Group 
1 001 ABB  1 
2 002 BCC  2 
3 003 AAA  2 
4 004 BBA  2 
5 005 BCC  1 

各グループの各文字の頻度と割合を知るためのテーブルを取得したいと考えています。

 Group 
     1 2 
A  1 4 
B  3 3 
C  2 2 
Total 6 9 

そして、それの割合

 Group 
     1  2 
A  0.17 0.44 
B  0.50 0.33 
C  0.33 0.22 
Total% 1.00 1.00 

私は次のことをしようと、それはエラーを示しています。

str_count(df$TYPE[(df$Group==1], pattern = "A") 
str_count(df$TYPE[(df$Group==2], pattern = "A") 
str_count(df$TYPE[(df$Group==1], pattern = "B") 
str_count(df$TYPE[(df$Group==2], pattern = "B") 
str_count(df$TYPE[(df$Group==1], pattern = "C") 
str_count(df$TYPE[(df$Group==2], pattern = "C") 

ありがとうございます。

答えて

9

を:

tbl <- table(stack(`names<-`(strsplit(df$TYPE, ""), df$Group))) 
#  ind 
#values 1 2 
#  A 1 4 
#  B 3 3 
#  C 2 2 

その後、我々はできますパーセンテージを追加:

round(prop.table(tbl, 2), 2) 
#  ind 
#values 1 2 
#  A 0.17 0.44 
#  B 0.50 0.33 
#  C 0.33 0.22 

ご希望の場合合計:

addmargins(tbl, 1) 
+0

ありがとうございます。しかし、それは "strsplit(df $ TYPE、" ")のエラー:文字以外の引数" ... –

+0

が表示されます。 'class(df $ TYPE)'をチェックしてください。あなたは誤って変数を因子としてコード化しました。変数をモデリングのカテゴリ変数として使用しない場合は、 'stringsAsFactors = FALSE'を使用する必要があります。 –

+1

@TerenceTien 'as.character'を使って、' strsplit(as.character(df $ Type)、 "") ' –

1

あなたはdplyrtidyrを使用することができます。

library(dplyr); library(tidyr) 
df %>% group_by(Group) %>% summarise(TYPE = unlist(strsplit(TYPE, ""))) %>% 
     group_by(Group, TYPE) %>% summarise(Count = n()) %>% spread(Group, Count) 

# Source: local data frame [3 x 3] 
# 
# TYPE  1  2 
# (chr) (int) (int) 
# 1  A  1  4 
# 2  B  3  3 
# 3  C  2  2 

パーセント数を取得するには:どのようにstacktableとベースは約

df %>% group_by(Group) %>% summarise(TYPE = unlist(strsplit(TYPE, ""))) %>% 
     group_by(Group, TYPE) %>% summarise(Count = n()) %>% 
     spread(Group, Count) %>% mutate_each(funs(round(./sum(.), 2)), -TYPE) 

# Source: local data frame [3 x 3] 
# 
# TYPE  1  2 
# (chr) (dbl) (dbl) 
# 1  A 0.17 0.44 
# 2  B 0.50 0.33 
# 3  C 0.33 0.22 
+0

あなたは簡素化することができます: 'DF%>%separate_rows(TYPE、9月= '\\ B')%>%のカウント(TYPE、グループ)%を>%spread(Group、n)%>%ungroup()%>%mutate_each(funs(prop.table)、-TYPE) ' – alistaire

+0

@alistaireここで、関数 'separate_rows'はどこから来たのですか? – Psidom

+0

最近、「tidyr」に追加されました(https://github.com/hadley/tidyr/blob/master/NEWS.md) – alistaire