如何在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)