我有一个表,它看起来像这样,但有更多的条目:
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")