我試圖根據一系列條件更改數據幀列中條目的值。我需要更改某個類型的頂部(或底部)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,但到目前爲止,我一直無法找到任何可以爲此提供解決方案的內容。我不想簡單地打印出修改過的數據幀,我想用新條目更新原始數據幀條目。
分配給子集。 – alistaire