R中表格的分层排序



我有一个表,它看起来像这样,但有更多的条目:

ID     Gene     Tier     Consequence   
1314   ABC      TIER1    missense  
1314   PKD1     TIER1    frameshift 
1314   PKD1     TIER1    stop_gain 
6245   BJD      TIER1    splice_site_variant 
7631   PKD2     TIER1    missense
7631   PKD2     TIER1    non_coding
5336   PKD1     TIER3    missense
1399   PKD1     TIER2    non_coding

我想在结果层次结构上为每个ID一行的结果层次结构子集:stop_gain>framshift>splice_site_variant>错义>n on_coding_mutation。实际上,大约有10种类型的";"后果";按层次顺序。

期望结果:

ID Gene Tier Consequence
1314 PKD1 TIER1 stop_gain
6245 BJD  TIER1 splice_site_variant
7631 PKD2 TIER1 missense
5336 PKD1 TIER3 missense
1399 PKD1 TIER2 non_coding

我曾想过将后果转化为数字,然后使用它,但我想知道是否有一种方法可以单独使用文本来实现这一点。我在气闸环境中的HPC中工作,所以使用基本R的解决方案会更好。

非常感谢您抽出时间

如果将Consequence转换为有序因子,则可以在基本R中执行此操作,并坚持使用文本:

df$Consequence <- ordered(df$Consequence, 
levels = rev(c("stop_gain", "frameshift", 
"splice_site_variant", 
"missense", "non_coding")))

然后你可以通过多种方式在每组中获得最大值。例如,使用split-apply-bind方法:

do.call(rbind, lapply(split(df, df$ID), function(x) x[which.max(x$Consequence),]))
#>        ID Gene  Tier         Consequence
#> 1314 1314 PKD1 TIER1           stop_gain
#> 1399 1399 PKD1 TIER2          non_coding
#> 5336 5336 PKD1 TIER3            missense
#> 6245 6245  BJD TIER1 splice_site_variant
#> 7631 7631 PKD2 TIER1            missense

我建议使用因子根据您的标准建立排名,然后使用dplyr中的filter()进行子集划分。这是代码。逻辑类似于@AllanMeron解决方案,但我将因子转换为数字,然后过滤:

library(dplyr)
#Data
#Define order
vord <- c('stop_gain','frameshift','splice_site_variant','missense','non_coding')
#Format data
df$Consequence <- factor(df$Consequence,levels = vord,ordered = T)
#Compute index
df$Index <- as.numeric(df$Consequence)
#Filter
df %>% group_by(ID) %>% filter(Index==min(Index)) %>% select(-Index)

输出:

# A tibble: 5 x 4
# Groups:   ID [5]
ID Gene  Tier  Consequence        
<int> <chr> <chr> <ord>              
1  1314 PKD1  TIER1 stop_gain          
2  6245 BJD   TIER1 splice_site_variant
3  7631 PKD2  TIER1 missense           
4  5336 PKD1  TIER3 missense           
5  1399 PKD1  TIER2 non_coding  

使用的一些数据:

#Data
df <- structure(list(ID = c(1314L, 1314L, 1314L, 6245L, 7631L, 7631L, 
5336L, 1399L), Gene = c("ABC", "PKD1", "PKD1", "BJD", "PKD2", 
"PKD2", "PKD1", "PKD1"), Tier = c("TIER1", "TIER1", "TIER1", 
"TIER1", "TIER1", "TIER1", "TIER3", "TIER2"), Consequence = structure(c(4L, 
2L, 1L, 3L, 4L, 5L, 4L, 5L), .Label = c("stop_gain", "frameshift", 
"splice_site_variant", "missense", "non_coding"), class = c("ordered", 
"factor")), Index = c(4, 2, 1, 3, 4, 5, 4, 5)), row.names = c(NA, 
-8L), class = "data.frame")

最新更新