2016-09-16 146 views
1

我試圖根據一系列條件更改數據幀列中條目的值。我需要更改某個類型的頂部(或底部)10個條目的'組'值。dplyr更新子集後的新值的原始數據幀

我的數據是在一個數據幀,看起來像這樣:

> head(diff_df_min) 
    external_gene_name gene_biotype Fold p.value  group 
1  RP11-431K24.1  lincRNA -4.13 4.86e-06 signif_fc 
2    UBE4B protein_coding 2.42 3.91e-06 signif_fc 
3    UBIAD1 protein_coding 2.74 5.58e-05 signif_fc 
4    PTCHD2 protein_coding 3.37 2.68e-06 signif_fc 
5    DRAXIN protein_coding 3.04 1.42e-06 signif_fc 
6    VPS13D protein_coding 4.26 1.60e-07 signif_fc 

> dim(diff_df_min) 
[1] 1824 5 

我想通了這個解決方案與dplyr

diff_df_min %>% 
     filter(gene_biotype == "protein_coding") %>% # subset for protein coding genes 
     arrange(-Fold, p.value) %>% # Sort by Fold change, then by p value 
     slice(1:10) %>% # take the top 10 entries... 
     mutate(group = "top_signif_fc") # ... and change the "group" column value to "top_signif_fc" 

這讓我想確切的結果:

external_gene_name gene_biotype Fold p.value   group 
1    CROCC protein_coding 5.46 3.44e-14 top_signif_fc 
2    KCNA2 protein_coding 5.43 2.08e-11 top_signif_fc 
3    PITPNC1 protein_coding 5.32 8.16e-11 top_signif_fc 
4    RRP8 protein_coding 5.31 1.01e-10 top_signif_fc 
5    HEPACAM protein_coding 5.27 1.26e-10 top_signif_fc 
6    SGK223 protein_coding 5.14 3.45e-15 top_signif_fc 
7    DDX3Y protein_coding 5.03 1.82e-09 top_signif_fc 
8   ARHGAP10 protein_coding 4.99 2.83e-09 top_signif_fc 
9    RNF180 protein_coding 4.98 3.19e-09 top_signif_fc 
10    CSPG5 protein_coding 4.97 9.92e-12 top_signif_fc 

除了這不更新原始數據框中的這些值,它只是笑在應用函數後得到結果。同樣,我試圖做data.table相同,想通了這個方法:

setDT(diff_df_min,key = "external_gene_name") 
diff_df_min[gene_biotype == "protein_coding"][order(-Fold, p.value), head(.SD, 10)][,group := "top_signif_fc"] 

,但這又只是返回結果,它不會更新原始數據幀。

external_gene_name gene_biotype Fold p.value   group 
1:    CROCC protein_coding 5.46 3.44e-14 top_signif_fc 
2:    KCNA2 protein_coding 5.43 2.08e-11 top_signif_fc 
3:   PITPNC1 protein_coding 5.32 8.16e-11 top_signif_fc 
4:    RRP8 protein_coding 5.31 1.01e-10 top_signif_fc 
5:   HEPACAM protein_coding 5.27 1.26e-10 top_signif_fc 
6:    SGK223 protein_coding 5.14 3.45e-15 top_signif_fc 
7:    DDX3Y protein_coding 5.03 1.82e-09 top_signif_fc 
8:   ARHGAP10 protein_coding 4.99 2.83e-09 top_signif_fc 
9:    RNF180 protein_coding 4.98 3.19e-09 top_signif_fc 
10:    CSPG5 protein_coding 4.97 9.92e-12 top_signif_fc 

你可以看到這個當您檢查在數據幀中的值運行這些命令後(或再次運行該命令的子集):

> diff_df_min[which(diff_df_min['external_gene_name'] == "CROCC"),] 
    external_gene_name gene_biotype Fold p.value  group 
372    CROCC protein_coding 5.46 3.44e-14 signif_fc 

和當然,如果你嘗試使用兩種方法是這樣的:

diff_df_min <- ... 

你最終只能選擇與dplyr或的是,10號線覆蓋原來的數據幀。

我以前一直在做基地R類似的事情,但無法得到這種情況下工作。我試了一下,結束了這一點,這是荒謬的,不正常工作:

diff_df_min[with(diff_df_min[which(diff_df_min['gene_biotype'] == "protein_coding"),], order(-Fold, p.value)),"group"][1:top_gene_number] <- "top_signif_fc" 

^^某處一路上,索引搞的一團糟,因此被最終改變項不是預期條目。

到目前爲止,我已經閱讀了幾十本關於此的網頁,其中包括很多教程,甚至還有this,但到目前爲止,我一直無法找到任何可以爲此提供解決方案的內容。我不想簡單地打印出修改過的數據幀,我想用新條目更新原始數據幀條目。

+0

分配給子集。 – alistaire

回答

3

我們可以用一個ifelse語句來進行更改,而不是slice到子集,並同時更換filter(即刪除行)基於「protein_coding」與arrange ING爲好,同時指定輸出回到原始數據集或到一個新的

diff_df_minNew <- diff_df_min %>% 
        arrange(desc(gene_biotype == "protein_coding"), 
           desc(Fold), p.value) %>% 
        mutate(group = ifelse(row_number() < 11, "top_signif_fc", group)) 

使用data.table甲對應的選項將是

library(data.table) 
diff_df_minNew2 <- setDT(diff_df_min)[order(-(gene_biotype=="protein_coding"), 
     -Fold, p.value)][seq_len(10), group := "top_signif_fc"][] 
+0

過濾器語句仍然不會使這覆蓋原來的? – zacdav

+0

@zacdave改變了'filter'步驟 – akrun

+1

謝謝,它看起來像它的作品! – user5359531