【问题标题】:R function across dataframe based on flexible subsetting/conditional基于灵活子集/条件的跨数据帧的 R 函数
【发布时间】:2023-03-09 04:02:02
【问题描述】:

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

我想做以下事情:

如果SampleIDMaterialID_sub 中指定的8 个MaterialIDs 中至少有6 个,则将MaterialID_sub 中该样本的ID 浓度相加,然后乘以2。例如,样本A25 包含MaterialID_sub 中的 8 个 ID 中有 7 个,然后这 7 个 ID 的浓度相加等于 3.87,然后乘以 2 等于 7.74。然而,样本 A26 至少没有 6 个在 MaterialID_sub 中列出的 ID,因此不会相加。

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

SampleID   Sum*2   
A25        7.74     
Etc.

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

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

【问题讨论】:

    标签: r dplyr subset


    【解决方案1】:

    我们可以按“SampleID”、filter 这些 SampleID 根据条件进行分组,即至少 6 个 MaterialID 应该与 MaterialID_Sub 中的匹配,并且只保留那些匹配的行,然后得到“浓度”的 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
    

    【讨论】:

    • akrun,非常感谢。该解决方案易于遵循并且可以完成工作。
    • @jport 谢谢,请查看here
    猜你喜欢
    • 2022-08-18
    • 2019-10-22
    • 2018-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-13
    • 2020-02-17
    • 2018-06-07
    相关资源
    最近更新 更多