如何在R中基于条件删除行?

3

我是新手使用R语言,一直在使用dplyr包来进行数据汇总。但是对于以下问题我无法找到解决方案。

我的tibble表格是一个3列8行的矩阵:

df <- tibble(id = c(1, 1, 1, 1, 1, 2, 2, 2 ),
                 block = c(2, 2, 2, 3, 3, 2, 2, 3), 
                 answer = "TRUE")
编号 区块 答案
1 2 正确
1 2 正确
1 2 正确
1 3 正确
1 3 正确
2 2 正确
2 2 正确
2 3 正确

ID -> 参与者编号

block -> 最高正确区块

我希望仅保留每个参与者的最高区块分数,但最高区块分数的定义是至少有两个正确(TRUE)答案的最高分数。

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

最终输出应该像这样:

编号 区块 答案
1 3 正确
2 2 正确

有没有任何想法可以指导我如何开始?或者有什么包可以解决这个问题吗?

我使用了slice_tail参数来保留每个参与者的最后一行,但不确定下一步该怎么做。

3个回答

5

filter 过滤只保留那些拥有 >= 2TRUE 值的块,然后对于每个 id,仅保留拥有最大 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函数。 - MeiLing

3

这将会有效

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 

1

如果您只想使用基本的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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接