基于灵活子集/条件的跨数据帧 R函数



我在R中有以下示例数据框架:

SampleID = c("A25", "A25", "A25", "A25", "A25", "A25", "A25", "A25", "A25", "A25", "A26", "A26", "A26", "A26", "A26", "A26", "A26", "A26", "A26", "A26")
MaterialID = c("DR1", "DR4", "DR9", "DR10", "DR12", "DR14", "DR15", "DR18", "DR23", "DR25", "DR3", "DR5", "DR9", "DR11", "DR12", "DR13", "DR15", "DR18", "DR23", "DR26")
Concentration = c(0.15, 0.02, 0.43, 0.56, 0.13, 1.2, 0.08, 0.03, 1.78, 0.65, 0.86, 0.04, 0.67, 1.2, 0.11, 0.04, 0.24, 0.08, 1.01, 0.95)
MyData = data.frame(SampleID, MaterialID, Concentration)

它看起来像这样:

SampleID MaterialID Concentration
1       A25        DR1          0.15
2       A25        DR4          0.02
3       A25        DR9          0.43
4       A25       DR10          0.56
5       A25       DR12          0.13
6       A25       DR14          1.20
7       A25       DR15          0.08
8       A25       DR18          0.03
9       A25       DR23          1.78
10      A25       DR25          0.65
11      A26        DR3          0.86
12      A26        DR5          0.04
13      A26        DR9          0.67
14      A26       DR11          1.20
15      A26       DR12          0.11
16      A26       DR13          0.04
17      A26       DR15          0.24
18      A26       DR18          0.08
19      A26       DR23          1.01
20      A26       DR26          0.95

我也有一个我特别感兴趣的materialid列表,存储在变量MaterialID_sub中。

MaterialID_sub = c("DR1", "DR4", "DR10", "DR12", "DR14", "DR18", "DR23", "DR28")

我想做以下事情:

如果SampleID中至少有MaterialID_sub中规定的8种MaterialIDs中的6种,则将该样品MaterialID_sub中IDs的浓度相加,然后乘以2。例如,样品A25包含MaterialID_sub中8个id中的7个,这7个id的浓度相加等于3.87,然后乘以2等于7.74。然而,样本A26不包含MaterialID_sub中列出的至少6个id,因此不会被求和。

输出看起来像这样,其中只有满足上述标准的样本才包含在输出中(例如,A25):

SampleID   Sum*2   
A25        7.74     
Etc.

请注意,我提供的示例只是包含数百个SampleIDs的更大数据集的一个小子集,而给定样本的MaterialIDs的实际数量要大得多。所以扩大规模很重要。如果有一种方法可以将这些代码合并到dplyr管道中,那就太好了。这个问题的解决方案似乎超出了我对R的掌握范围,因为我的尝试到目前为止都失败了。

任何建议都非常感谢,谢谢!

我们可以根据条件按'SampleID',filter分组,即至少6个MaterialID应该与MaterialID_Sub匹配,只有匹配的行应该保留,然后得到'Concentration'的sum并乘以2

library(dplyr)
MyData %>% 
group_by(SampleID) %>%
filter(sum(MaterialID %in% MaterialID_sub)>=6,
MaterialID %in% MaterialID_sub) %>% 
summarise(Sum = sum(Concentration) * 2)

与产出

# A tibble: 1 x 2
# SampleID   Sum
#  <chr>    <dbl>
#1 A25       7.74

最新更新