【问题标题】:Check if a character exists in a specific group and create a new column in R检查特定组中是否存在字符并在 R 中创建新列
【发布时间】:2020-08-24 16:15:34
【问题描述】:

提前感谢您抽出宝贵时间阅读这篇文章。我有一个看起来像这样的data.frame

time   offspring
 1         1
 1         2
 2         1
 2         5
 3         1
 3         4

我想检查每个时间点的后代是否与上一个时间点的后代匹配。更明确地说,我想看看时间点 1 和时间点 2 的后代是否存在于时间点 3 中。

在这种情况下,我想在新列中为后代分配值 1,而不是在新列中分配值 0.4。 例如

time   offspring  alpha
 1         1       1
 1         2       0.4
 2         1       1
 2         5      0.4
 3         1       1
 3         4       1

非常感谢任何帮助和评论。

【问题讨论】:

    标签: r dplyr match tidyverse


    【解决方案1】:

    一个dplyr 选项可以是:

    df %>%
     group_by(offspring) %>%
     mutate(alpha = pmax(0.4, all(1:3 %in% time)))
    
       time offspring alpha
      <int>     <int> <dbl>
    1     1         1   1  
    2     1         2   0.4
    3     2         1   1  
    4     2         5   0.4
    5     3         1   1  
    6     3         4   0.4
    

    如果仅在时间段 3 出现的病例也应视为病例:

    df %>%
     group_by(offspring) %>%
     mutate(alpha = pmax(0.4, all(1:3 %in% time) | unique(time) == 3))
    
       time offspring alpha
      <int>     <int> <dbl>
    1     1         1   1  
    2     1         2   0.4
    3     2         1   1  
    4     2         5   0.4
    5     3         1   1  
    6     3         4   1 
    

    【讨论】:

    • 两种解决方案都非常简洁。非常感谢@tmfmnk。我很想知道关于代码“mutate(alpha = pmax(0.4, all(1:3 %in% time) | unique(time) == 3))”每个部分的更多细节。我知道我要求太多,请不要觉得有义务这样做。
    • 它检查是否所有值 1、2 和 3 在时间上都存在,或者每组是否只有一个等于 3 的唯一时间值。如果满足条件,则返回 TRUE,否则返回 FALSE。然后,pmax() 函数返回由 0.4 组成的一对值中的最大值和上述逻辑测试的结果。因此,如果条件为 TRUE,则最大值为 1,如果条件为 FALSE,则最大值为 0.4。
    • 令人印象深刻。非常聪明的思考
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-31
    • 1970-01-01
    • 2022-01-20
    • 2018-05-21
    • 2017-12-16
    • 2021-11-26
    相关资源
    最近更新 更多