我在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