2016-01-08 38 views
5
ID<-c("R1","R2","R2","R3","R3","R4","R4","R4","R4","R3","R3","R3","R3","R2","R2","R2","R5","R6") 
event<-c("a","b","b","M","s","f","y","b","a","a","a","a","s","c","c","b","m","a") 
df<-data.frame(ID,event) 

如何修改下面的代碼來獲取此表。 2 - 如何得到每個頻率元素的平均頻率?例如:a的平均頻率爲1 + 3 + 1 + 1/4。帶有ddply功能的頻率表

ddply(df,.(ID),summarise,N=sum(!is.na(ID)),frequency=length(event)) 

ID N Number-event-level levels  frequency 
R1 1  1     a    a=1 
R2 5  2     b,c   b=3,c=2 
R3 6  3     M,a,s  M=1,a=3,s=2 
R4 4  4     f,y,b,a f=1,y=1,b=1,a=1 
R5 1  1     m    m=1 
R6 1  1     a    a=1 
+0

你試過:'ftable(DF)' – Badger

+0

非常感謝您的幫助。 – shoorideh

回答

3

這裏的第一個問題的答案:

ddply(df,.(ID),summarise, 
     N=length(event), 
     Number.event.level=length(unique(event)), 
     levels=paste(sort(unique(event)),collapse=","), 
     frequency=paste(paste(sort(unique(event)),table(event)[table(event)>0],sep="="),collapse=",")) 
# ID N Number.event.level levels  frequency 
# 1 R1 1     1  a    a=1 
# 2 R2 5     2  b,c   b=3,c=2 
# 3 R3 6     3 a,M,s  a=3,M=1,s=2 
# 4 R4 4     4 a,b,f,y a=1,b=1,f=1,y=1 
# 5 R5 1     1  m    m=1 
# 6 R6 1     1  a    a=1 

關於第二個問題,好像你想要得到的平均頻率當頻率大於0。如果是這樣的話,你可以這樣做:

apply(table(df),2,function(x) mean(x[x>0])) 
# a b c f m M s y 
# 1.5 2.0 2.0 1.0 1.0 1.0 2.0 1.0 

更新

如果你想這樣做,最後一部分,第三個變量的每個級別,你仍想使用ddply()你可以做到以下幾點:

df1 <- rbind(df,df) 
df1$cat <- rep(c("a","b"),each=nrow(df)) 

ddply(df1,.(cat),function(y) apply(table(y),2,function(x) mean(x[x>0]))) 
# cat a b c f m M s y 
# 1 a 1.5 2 2 1 1 1 2 1 
# 2 b 1.5 2 2 1 1 1 2 1 
+0

太好了,非常感謝 – shoorideh

+0

我還有一個問題。我如何修改你的解決方案(第二部分)如果我有,三個分類變量。我想計算每個級別的第三個變量的事件平均值(總和(事件)/ ID數量)。我的意思是,我想爲第三個變量的每個級別計算apply(table(df $ ID,df $ event),2,function(x)mean(x [x> 0]))。 – shoorideh

+0

查看上面的更新。 –