汇总每列和每行的数据

时间:2014-04-29 05:10:48

标签: r dataframe

我在下面有一个示例数据框。 (1表示是,2表示否)

Age Range        Ans
10 - 20           1 
21 - 30           2
31 - 40           1
10 - 20           2
21 - 30           2 
21 - 30           1
21 - 30           2

期望的输出:

Age_Range        Yes        No
10 - 20           1         1
21 - 30           1         3
31 - 40           1         0

我怎样才能在R?

中完成

2 个答案:

答案 0 :(得分:6)

在基地R中,您基本上只是要求table

table(dat$Age.Range, dat$Ans)
#           1 2
#   10 - 20 1 1
#   21 - 30 1 3
#   31 - 40 1 0

如果您想将其转换为列名:

tab <- table(dat$Age.Range, dat$Ans)
data.frame(Age_Range=rownames(tab), Yes=tab[,"1"], No=tab[,"2"])
#         Age_Range Yes No
# 10 - 20   10 - 20   1  1
# 21 - 30   21 - 30   1  3
# 31 - 40   31 - 40   1  0

答案 1 :(得分:1)

我喜欢使用data.table来完成这些任务。

制作数据框:

library(data.table)

df <- read.table(text='Age Range        Ans
10 - 20           1 
21 - 30           2
31 - 40           1
10 - 20           2
21 - 30           2 
21 - 30           1
21 - 30           2',row.names=NULL)

df <- as.data.table(df)

df[,`Age Range`:=paste(row.names,Age,Range)]

尝试

df[,list(Yes=sum(Ans==1),No=sum(Ans==2)),by=`Age Range`]

#    Age Range Yes No
# 1:   10 - 20   1  1
# 2:   21 - 30   1  3
# 3:   31 - 40   1  0

或尝试dplyr方法:

library(dplyr)    

df %.% group_by(`Age Range`) %.% summarize(Yes=sum(Ans==1),No=sum(Ans==2))

#   Age Range Yes No
# 1   10 - 20   1  1
# 2   21 - 30   1  3
# 3   31 - 40   1  0