【问题标题】:How to find out whether a certain condition for a specific ID has ever been met in an R data frame?如何找出在 R 数据框中是否满足特定 ID 的特定条件?
【发布时间】:2021-03-05 18:32:49
【问题描述】:

我的问题看起来很简单,但我仍然没有想出一个可行的解决方案。假设我有一个体育赛事的数据框。在这个数据框中,我们找到了唯一的人员标识符和每次尝试的一个观察结果,以及他们是否通过了该特定尝试的信息。

data <- data.frame(
        PersonID = c(1, 2, 3, 3, 4, 4, 4, 5, 6),
        TryNumber = c(1, 1, 1, 2, 1, 2, 3, 1, NA),  
        Passed = c("Fail", "Pass", "Fail", "Pass", "Fail", "Fail", "Fail", "Pass", NA)
    )

我们看到第 1 个人只尝试了一次但失败了,第 2 个人第一次尝试通过,第 3 个人第一次尝试失败但第二次通过等等。我们有第 6 个人,他以某种方式进入数据但没有参加比赛.

我想要的结果是这样一个数据框,它告诉我在活动期间谁通过或失败(或者我们没有任何进一步的信息):

1 | Fail
2 | Pass
3 | Pass
4 | Fail
5 | Pass
6 | NA

诚挚的问候,非常感谢!

编辑:失败/通过的数据现在以字符格式提供。

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    您可以检查每个人的max 值。

    library(dplyr)
    
    data %>%
      group_by(PersonID) %>%
      summarise(result = case_when(max(Passed) == 0 ~ 'Fail', 
                                   max(Passed) == 1 ~ 'Pass'))
    
    #  PersonID result
    #*    <dbl> <chr> 
    #1        1 Fail  
    #2        2 Pass  
    #3        3 Pass  
    #4        4 Fail  
    #5        5 Pass  
    #6        6 NA    
    

    如果变量以字符格式存在,我们可以使用any/all

    data %>%
      group_by(PersonID) %>%
      summarise(result = case_when(any(Passed == 'Pass') ~ 'Pass', 
                                   all(Passed == 'Fail') ~ 'Fail'))
    

    【讨论】:

    • 这很聪明。非常感谢你的想法!为了保持最小化,我在示例中使用了“失败/通过”变量数字,但假设此信息以字符格式存在。
    • 我们可以利用any/all。查看我的更新答案@KlausPeter
    • 谢谢,但遗憾的是,这只会为我返回“NA”。 # 标题:6 x 2 PersonID 结果 * 1 1 NA 2 2 NA 3 3 NA 4 4 NA 5 5 NA 6 6 NA
    • 哦..我没有注意到您更改了数据。我的意思是检查与“通过”和“失败”相关的值。我更新了适用于新样本数据的答案。
    • 是的,我自己应该注意到了 :-) 我认为我的问题已得到解答。非常感谢。很高兴给你买了一杯咖啡。确保您检查我是否还有其他问题.... ;-)
    猜你喜欢
    • 2013-03-05
    • 1970-01-01
    • 2016-09-01
    • 1970-01-01
    • 2023-02-24
    • 2021-12-21
    • 2013-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多