2014-04-29 143 views
-3

下面我有一個示例數據框。 (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中?

回答

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 
+1

需求'文本='對於要創建的表。 – jbaums

+0

@jbaums謝謝,以上更正 –

+0

謝謝你的幫助。^_^ – Ianthe

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。這可能也會起作用:'setNames(as.data.frame.matrix(table(dat)),c(「Yes」,「No」))'' – A5C1D2H2I1M1N2O1R2T1