我有一个按区域分组的基因数据集,我测量了它们在区域之间的距离。
当前要计算所有区域的总距离,我在区域距离上使用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)
,但如果它仍然是重复的,但应该保留在另一个区域中,还可以包括该语句?
答案 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))