2013-04-16 49 views
1

我想獲得一個表格,其中包含其他因素變量的變量的前10個絕對和相對頻率。 我有一個3列的數據框:1列是一個因子變量,2是其他變量我需要計數,3是邏輯變量作爲約束。 (真正的數據庫擁有超過4mln觀察)R:相對頻率r按係數

dtf<-data.frame(c("a","a","b","c","b"),c("aaa","bbb","aaa","aaa","bbb"),c(TRUE,FALSE,TRUE,TRUE,TRUE)) 
colnames(dtf)<-c("factor","var","log") 
dtf 

factor var log 
1  a aaa TRUE 
2  a bbb FALSE 
3  b aaa TRUE 
4  c aaa TRUE 
5  b bbb TRUE 

所以我需要找到的「VAR」頂絕對和相對頻率,其中「登錄」 == TRUE跨越的「因素」,每個因素。

我已經試過這絕對頻率(在實際分貝我提取前10名,在這裏我得到2線):

t1<-tapply(dtf$var[dtf$log==T],dtf$factor[dtf$log==T],function(x)(head(sort(table(x),decreasing=T),n=2L))) 
# Returns array of lists: list of factors containing list of top frequencies 
t2<-(t1, ldply) 
# Split list inside by id and freq 
t3<-do.call(rbind, lapply(t2, data.frame)) 
# Returns dataframe of top "var" values and corresponding freq for each group in "factor" 
# Factor variable's labels are saved as row.names in t3 

以下功能可以找到相對頻率爲整個數據庫,而不是因素分組:

getrelfreq<-function(x){ 
v<-table(x) 
v_rel<-v/nrow(dtf[dtf$log==T,]) 
head(sort(v_rel,decreasing=T),n=2L)} 

但是我有一個相對頻率的問題,因爲我需要通過的「VAR」行數來劃分的絕對頻率經各種因素的「變種」,不是全部nrow其中「登錄」 = = T。我不知道如何在tapply循環中使用它,以便分母對每個因素都會有所不同。 我也想在1 tapply循環中使用這兩個函數,而不是生成許多表和合並結果。但不知道如何將這兩個功能放在一起。

請幫助:)

回答

1

如果我理解正確的話,你可以這樣做什麼,我都寫在下面。使用dcast來獲得每個factor的每個var的頻率,然後使用rowSums()將它們相加以獲得所有因子中每個變量的絕對頻率。您可以使用prop.table計算每個factor中每個var的相對頻率。注意我對示例數據做了輕微更改,以便您可以跟蹤每個階段發生的情況(我在log == TRUE時爲factorb添加了'bbb'值)。試試這個:

#Data frame (note 2 values for 'bbb' for factor 'b' when log == TRUE) 
dtf<-data.frame(c("a","a","b","c","b","b"),c("aaa","bbb","aaa","aaa","bbb","bbb"),c(TRUE,FALSE,TRUE,TRUE,TRUE,TRUE)) 
colnames(dtf)<-c("factor","var","log") 
dtf 
#  factor var log 
#1  a aaa TRUE 
#2  a bbb FALSE 
#3  b aaa TRUE 
#4  c aaa TRUE 
#5  b bbb TRUE 
#6  b bbb TRUE 


library(reshape2) 

# Find frequency of each var across each factor using dcast 
mydat <- dcast(dtf[dtf$log==TRUE , ] , var ~ factor , sum) 
# var a b c 
#1 aaa 1 1 1 
#2 bbb 0 2 0 

# Use rowSums to find absolute frequency of each var across all groups 
mydat$counts <- rowSums(mydat[,-1]) 
# Order by decreasing frequency and just use first 10 rows 
mydat[ order(mydat$counts , decreasing = TRUE) , ] 
# var a b c counts 
#1 aaa 1 1 1  3 
#2 bbb 0 2 0  2 


# Relative proportions for each var across the factors 
data.frame(var = mydat$var , round(prop.table(as.matrix(mydat[,-c(1,ncol(mydat))]) , 1) , 2)) 
# var a b c 
#1 aaa 0.33 0.33 0.33 
#2 bbb 0.00 1.00 0.00 
+0

非常感謝你的線索! 但我的數據有問題,我的「var」也是因子變量,其中有超過6000個關卡,所以我的mydat將會非常龐大​​。但我想它會採用相同的系統時間來獲得前10名頻率?我不知道如何得到除你的方法以外的數量,所以沒有選擇:) – Asayat

+0

@Asayat嗯,我想你必須計算所有的頻率(足夠接近),找到前10名。試試看 - 如果它崩潰你的電腦然後我們需要找到另一種方式! :-)你有多少行數據?因素中有多少個不同的變量? 'unqiue(dtf $因子)' –

+0

@Asayat有沒有運氣? –