2017-06-27 47 views
0

列條目成單獨的列的頻率我有一個數據幀,看起來像:集結中的R

POP<-c(rep("POP1",6), rep("POP2",6), rep("POP3", 6)) 
IID<-c(rep("POP1_1", 2), rep("POP1_2",2), rep("POP1_3", 2), rep("POP2_1",2), rep("POP2_2",2), rep("POP2_3",2), rep("POP3_1",2), rep("POP3_2",2),rep("POP3_3",2)) 
Site1<-c(36, 42, 32, 32, 48, 42, 36, 36, 48, 42, 36, 48, 28, 32, 32, 32, 48, 32) 
Site2<-c(10, 8, 10, 16, 16, 10, 10, 10, 16, 10, -9, -9, 16, 8, 10, 10, 8, 8) 
dat<-cbind(POP, IID, Site1, Site2) 

隨着網站更多的列,並且有更多的POP基團。我想按列進行瀏覽,對於列中的每個不同條目,我想要一個新列包含該條目的頻率,並彙總在POP列中。 -9表示缺失值。我不希望這些內容構成專欄,或者爲頻率做出貢獻。

最終,上述數據會看起來像:

dat 

POP Site1_28 Site1_32 Site1_36 Site1_42 Site1_48 Site2_8 Site2_10 Site2_16 
POP1 0  0.333 0.167 0.333 0.166 0.167 0.5  0.333 
POP2 0  0  0.5  0.167 0.333 0  0.75  0.25  
POP3 0.167 0.667 0  0  0.167 0.5  0.333 0.167 

我猜我會在lapply()在一些使用表()和骨料()的尋找,但我真的沒有想法從哪裏開始。

謝謝!

回答

1

我認爲這應該做你想做的。首先,我們做一些數據處理,使我們致電table工作。然後,我們遍歷這兩列,對每個POP值的網站執行prop.table。最後,我們使用rbindcbind來組合數據。

#create data.frame 
dat<-data.frame(POP, IID, Site1, Site2, 
       stringsAsFactors = FALSE) 
#identify columns containing 'Site' 
site_col_names <- names(dat)[grep(pattern = 'Site', x = names(dat))] 
#for each site column, recode -9 as NA, and then paste 
for(i in site_col_names){ 
    dat[i] <- factor(sapply(dat[i], function(x) 
    ifelse(x == -9, NA, paste0(i,'_',x)))) 
} 
#iterate over columns, calculate prop.table 
do.call('cbind', 
     lapply(site_col_names, function(n){ 
      do.call('rbind', 
        by(dat, dat$POP, function(d) prop.table(table(d[n])))) 
     })) 

     Site1_28 Site1_32 Site1_36 Site1_42 Site1_48 Site2_10 Site2_16 Site2_8 
POP1 0.0000000 0.3333333 0.1666667 0.3333333 0.1666667 0.5000000 0.3333333 0.1666667 
POP2 0.0000000 0.0000000 0.5000000 0.1666667 0.3333333 0.7500000 0.2500000 0.0000000 
POP3 0.1666667 0.6666667 0.0000000 0.0000000 0.1666667 0.3333333 0.1666667 0.5000000 
+0

謝謝,這似乎是一個很好的開始,可能會發生,但我有超過100列。有沒有辦法讓它自動化一下? –

+0

我編輯了我的答案,使其更加自動化。它也照顧'-9'問題 – bouncyball

+0

非常感謝你! –