【问题标题】:How to use remove duplicates in r but also keep some conditional duplicates如何在 r 中使用删除重复项但同时保留一些有条件的重复项
【发布时间】:2019-11-29 03:13:04
【问题描述】:

我有一个按地区分组的基因数据集,我测量了它们在各自地区之间的距离。

目前要计算我在我的区域距离上使用unique() 的所有区域的总距离,但这并没有考虑到 2 个区域可能具有完全相同的数字的可能性,并且在我对总距离求和时都应该保留.

我想我不确定如何将此条件合并到我的代码中,我在这里找到的其他问题没有我需要的基于其他数据列的条件。

例如我的数据如下所示:

Gene  region  region.distance
ACE      1       10
AGT      1       10
BRCA     2       20
DVL1     3       10
NOTCH3   4       40

然后我使用此代码获取 region.distance 中的唯一值以求总距离:

total.distance <- sum(unique(df$region.distance))

但是,这不包括距离均为 10 的区域 1 和 3。我上面示例数据的输出总距离应该是 80 而不是 70。

我是否可以在 unqiue() 中加入一个 if 语句,例如使用 diff(df$region),但如果它仍然是重复的但在应该保留的不同区域中,也可以包括它?

【问题讨论】:

    标签: r


    【解决方案1】:

    您可以删除组内的重复项,然后sum

    library(dplyr)
    df %>%
      group_by(region) %>%
      filter(!duplicated(region.distance)) %>%
      pull(region.distance) %>% sum
    #[1] 80
    

    类似地,在基数 R 中我们可以这样做

    sum(subset(df, !ave(region.distance, region, FUN = duplicated))$region.distance)
    #[1] 80
    

    数据

    df <- structure(list(Gene = structure(1:5, .Label = c("ACE", "AGT", 
    "BRCA", "DVL1", "NOTCH3"), class = "factor"), region = c(1L, 
    1L, 2L, 3L, 4L), region.distance = c(10L, 10L, 20L, 10L, 40L)), 
    class = "data.frame", row.names = c(NA, -5L))
    

    【讨论】:

      【解决方案2】:

      我们可以使用data.table

      library(data.table)
      unique(setDT(df),by = c("region", "region.distance"))[, sum(region.distance)]
      #[1] 80
      

      数据

      df <- structure(list(Gene = structure(1:5, .Label = c("ACE", "AGT", 
      "BRCA", "DVL1", "NOTCH3"), class = "factor"), region = c(1L, 
      1L, 2L, 3L, 4L), region.distance = c(10L, 10L, 20L, 10L, 40L)), 
      class = "data.frame", row.names = c(NA, -5L))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-22
        • 1970-01-01
        • 2020-10-07
        • 2021-08-27
        • 1970-01-01
        • 1970-01-01
        • 2019-02-23
        • 1970-01-01
        相关资源
        最近更新 更多