如何在r中按组计算字符串中的字符数?

如何在r中按组计算字符串中的字符数?,r,string,count,R,String,Count,我有一个如下所示的数据框 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

我有一个如下所示的数据框

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      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")

提前感谢。

您可以使用
dplyr
tidyr

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
要获取百分比计数,请执行以下操作:

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

堆栈和
表格的底座如何:

tbl <- table(stack(`names<-`(strsplit(df$TYPE, ""), df$Group)))
#      ind
#values 1 2
#     A 1 4
#     B 3 3
#     C 2 2
如果您想要金额:

addmargins(tbl, 1)

非常感谢你。但它显示“strsplit(df$TYPE,”)中的错误:非字符参数”…您有类因子。选中
类(df$TYPE)
。您错误地将变量编码为因子。如果不将变量用作分类变量进行建模,则应使用
stringsAsFactors=FALSE
。@TerenceTien您可以使用
as.character
来修复此问题,
strsplit(as.character(df$Type),”)
您应该从头开始重新编码,而不是添加边缘修复,请从一开始就处理它。(不是对M.Lundberg的抨击)我的2c:使用
setNames
会有更清晰的意图
table(stack(setNames)(strsplit(…)
你可以简化:
df%>%分隔行(TYPE,sep='\\B')%%>%count(TYPE,Group)%%>%spread(Group,n)%%>%ungroup()%%>%mutate\u each(funs(prop.table),-TYPE)
@alistaire
分隔行的功能是从哪里来的?它是@alistaire非常棒!谢谢你的评论。找些新的东西来玩。但无论如何,我认为table仍然是这里的发展方向。
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)