【问题标题】:Add new column to dataframe with label based on if one column value is in between (range) of two other column values根据一个列值是否在其他两个列值之间(范围),将新列添加到带有标签的数据框
【发布时间】:2021-03-30 18:48:36
【问题描述】:

我有一个数据框(大约 300 行),其中一列称为“geneID”:

geneID   distance  pvalue
4        30        0.05
409      0         0.001
60       41        0.02
...

我有第二个数据框,它指示构成较大抗生素生物合成基因簇的基因范围(染色体中有大约 30 个基因簇):

ClusterID           start   end
Chloramphenicol     100     130
NRPS                403     489
Terpene             5021    5109
...

如果geneID在该基因簇的“开始”和“停止”之间,我想要做的是向数据帧1添加另一列,标记为数据帧2的相应“clusterID”:

geneID   distance  pvalue  ClusterID
4        30        0.05    NA
409      0         0.001   NRPS
60       41        0.02    NA

我尝试在 mutate 函数中使用向量作为值:

ChIP_table %>%
  mutate(ClusterID = case_when((ID >= biosynthetic_clusters$start & ID <= biosynthetic_clusters$end) ~ biosynthetic_clusters$Cluster,
                               TRUE ~ "NA"))

这没有用。不知道从这里去哪里。我已经尝试构建一个 for 循环,但仍然无法找到一种方法来使用向量/列值作为排序/标签的条件。

任何帮助将不胜感激!

【问题讨论】:

标签: r dataframe dplyr


【解决方案1】:

您可以使用cut 函数。假设您的数据框是df

breaks <- c(100, 130, 403, 489, 5021, 5109)
labels <- c("Chloramphenicol", NA, "NRPS", NA, "Terpene")

df$ClusterID <- cut(df$geneID, breaks = breaks, labels = labels, include.lowest = TRUE)

中断是开始值和结束值。标签是每个可行范围的 ClusterID 名称。 NA 标签用于可行的范围差距。因此,对于落入 ClusterID 范围内的基因 ID,它们将被分配 ClusterID 名称,否则为 NA。所以一些前期的工作需要输入标签向量。 (你可以编写一个函数来做到这一点。)但我认为它会起作用。

【讨论】:

    【解决方案2】:

    我们可以使用dplyr包中的case_when

    library(dplyr)
    
    df1 %>% 
      mutate(clusterID = case_when(geneID > df2$start & geneID < df2$end ~ df2$ClusterID))
    

    输出:

      geneID distance pvalue clusterID
       <dbl>    <dbl>  <dbl> <chr>    
    1      4       30  0.05  NA       
    2    409        0  0.001 NRPS     
    3     60       41  0.02  NA    
    

    数据:

    df1 <- tribble(
    ~geneID,   ~distance,  ~pvalue,
    4, 30, 0.05,
    409, 0, 0.001, 
    60, 41, 0.02)
    
    df2 <- tribble(
    ~ClusterID, ~start, ~end,
    "Chloramphenicol", 100, 130, 
    "NRPS", 403, 489, 
    "Terpene", 5021, 5109)
    

    【讨论】:

      猜你喜欢
      • 2019-03-23
      • 2021-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-04
      • 1970-01-01
      相关资源
      最近更新 更多