【问题标题】:Any idea on how to delete rows based on conditions in R?关于如何根据 R 中的条件删除行的任何想法?
【发布时间】:2021-09-10 05:08:38
【问题描述】:

我是 R 新手,我一直在使用 dplyr 包进行总结。我想不出以下问题的解决方案。

我的小标题:8 x 3 如下:

df <- tibble(id = c(1, 1, 1, 1, 1, 2, 2, 2 ),
                 block = c(2, 2, 2, 3, 3, 2, 2, 3), 
                 answer = "TRUE")
id block answer
1 2 TRUE
1 2 TRUE
1 2 TRUE
1 3 TRUE
1 3 TRUE
2 2 TRUE
2 2 TRUE
2 3 TRUE

ID -> 参与者 ID

block -> 最高正确的block

我只想保留每个参与者的最高块分数,但最高块分数定义为在每个块条件中至少有两个正确 (TRUE) 的最高分数。

在上面的示例中,参与者 1 的最高分块分数为 3,因为在块 3 处至少有两个正确的回答。参与者 2 的最高分数是 2。请参见下面的示例。

最终的输出应该是这样的:

id block answer
1 3 TRUE
2 2 TRUE

有人知道我应该如何开始吗?或者有什么包可以解决这个问题?

我设法使用slice_tail 参数为每​​个参与者维护了最后一行,但不知道如何从那里继续

【问题讨论】:

    标签: r dplyr tidyverse


    【解决方案1】:

    filter 只保留那些具有&gt;= 2 TRUE 值的块,稍后为每个id 保留具有max block 值的行。

    library(dplyr)
    
    df %>%
      group_by(id, block) %>%
      filter(sum(as.logical(answer)) >= 2) %>%
      group_by(id) %>%
      slice(which.max(block)) %>%
      ungroup
    
    #    id block answer
    #  <dbl> <dbl> <chr> 
    #1     1     3 TRUE  
    #2     2     2 TRUE  
    

    【讨论】:

    • 这行得通!太好了?我不知道基础R中的as.logical函数。
    【解决方案2】:

    这会起作用

    library(dplyr)
    
    df %>%
      group_by(id,block) %>%
      filter(answer == TRUE) %>%
      filter(n() > 1) %>%
      distinct() %>%
      group_by(id) %>%
      filter(block == max(block))
    
         id block answer
      <dbl> <dbl> <chr> 
    1     1     3 TRUE  
    2     2     2 TRUE 
    

    【讨论】:

      【解决方案3】:

      如果您只想使用基本 R,这里有一个建议。

      s=lapply(1:nrow(df),
          function(x) 
            df[df$id==x, ][ as.vector(max(df[df$id==x, 'block'])==df[df$id==x, 'block']), ]
          )
      
      ss=do.call(rbind.data.frame, s)
      unique(ss)
      

      【讨论】:

        猜你喜欢
        • 2020-09-02
        • 2015-11-24
        • 2019-07-07
        • 2021-12-08
        • 2018-10-04
        • 1970-01-01
        • 1970-01-01
        • 2018-09-21
        • 1970-01-01
        相关资源
        最近更新 更多