【问题标题】:Remove participants from data frame based off multiple column filters in R using inbuilt methods使用内置方法从 R 中基于多列过滤器的数据框中删除参与者
【发布时间】:2019-12-05 15:52:13
【问题描述】:

我有一个如下所示的数据框:

ID     Gene     Tier     Consequence   
1314   ABC      TIER1    missense  
1314   PKD1     TIER1    frameshift  
6245   BJD      TIER1    splice_site_variant 
1314   ADAMST   TIER3    stop_gain
7631   PKD2     TIER1    missense
7631   BFH      TIER2    stop_gain
5336   PKD1     TIER3    missense
1399   PKD1     TIER2    non-coding 

我想对表进行子集化,以便在满足条件时删除所有具有相关 ID 的行。

如果存在基因 PKD1 或 PKD2 的行且层级为 TIER1 或“错义”出现在 PKD1 或 PKD2 是基因的行的结果部分,我想删除所有实例对应的身份证。 IE 结果表应如下所示:

ID     Gene     Tier     Consequence    
6245   BJD      TIER1    splice_site_variant 
1399   PKD1     TIER2    non-coding

我在使用 R 的 HPC 上的气闸中工作,因此进出 R 工具很棘手(dplyr 等),因此非常感谢使用内置 R 工具的解决方案。

非常感谢

【问题讨论】:

  • @A.S.K.那是因为我是个白痴,没有给你一个很好的例子。我已将其更新为更清楚一点对不起!我添加了 ID 1399,虽然它有 PKD1,但它是 TIER2,不是错义,所以不会被过滤。道歉。

标签: r dataframe


【解决方案1】:

这是一个只有基本 R 的版本。它使用循环,所以如果你有一个非常大的数据集,你可能需要一些向量化的东西来提高效率。

for(current.id in unique(df$ID)) {
    if(nrow(df[df$ID == current.id &
               df$Gene %in% c("PKD1", "PKD2") &
               (df$Tier == "TIER1" |
                df$Consequence == "missense"),]) > 0) {
        df = df[df$ID != current.id,]
    }
}

【讨论】:

  • 感谢@A.S.K 这很好用。我现在需要尝试了解发生了什么!第 3 行 "df$Gene %in% c("PKD1, "PKD2") 是指 PKD1 还是 PKD2?为什么错义后需要 >0?
  • 完全正确; %in% 只是“等于向量中的任何内容”的快捷方式。 >0 是因为 if 条件询问“数据帧对于这个 ID 有多少有问题的行?” (这是nrow 部分。)如果答案是“大于0”,我们找到了需要消除的ID。
【解决方案2】:

一个选项是在按“ID”分组后,检查具有值“PKD1”、“PKD2”和(&)的“基因”,“Tier”的值为“TIER1”或(| ), thelagorlead`Consequence 的值为“missense”,如果没有,则返回“ID”

library(dplyr)
df1 %>% 
  group_by(ID) %>% 
  filter(!any(Gene %in% c("PKD1", "PKD2") & 
  (Tier == "TIER1"|
    (lag(Consequence, default = first(Consequence)) == "missense")|
      lead(Consequence, default = last(Consequence)) == "missense")))
# A tibble: 2 x 4
# Groups:   ID [2]
#    ID Gene  Tier  Consequence        
#  <int> <chr> <chr> <chr>              
#1  6245 BJD   TIER1 splice_site_variant
#2  1399 PKD1  TIER2 non-coding     

数据

df1 <- structure(list(ID = c(1314L, 1314L, 6245L, 1314L, 7631L, 7631L, 
5336L, 1399L), Gene = c("ABC", "PKD1", "BJD", "ADAMST", "PKD2", 
"BFH", "PKD1", "PKD1"), Tier = c("TIER1", "TIER1", "TIER1", "TIER3", 
"TIER1", "TIER2", "TIER3", "TIER2"), Consequence = c("missense", 
"frameshift", "splice_site_variant", "stop_gain", "missense",
"stop_gain", "missense", "non-coding")), 
class = "data.frame", row.names = c(NA, 
-8L))

【讨论】:

  • 感谢@akrun 的帮助!我会尝试让 dplyr 进入环境并试一试
猜你喜欢
  • 2020-01-26
  • 2013-11-26
  • 2014-06-29
  • 2018-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-26
相关资源
最近更新 更多