如何在r中使用删除重复项并保留一些条件重复项

时间:2019-11-28 11:24:05

标签: r

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

当前要计算所有区域的总距离,我在区域距离上使用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))

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

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

2 个答案:

答案 0 :(得分: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))

答案 1 :(得分:0)

我们可以使用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))