【问题标题】:dplyr drop values based on differencedplyr 基于差异丢弃值
【发布时间】:2021-07-27 10:34:30
【问题描述】:

我有一张这样的桌子

   Stimuli Subject Block TChosen Percentage
   <fct>   <fct>   <fct>   <int> <chr>     
 1 1       1       13          7 14.29%    
 2 2       1       13         18 36.73%    
 3 3       1       13         24 48.98%    
 4 1       2       13          3 6.12%     
 5 2       2       13         15 30.61%    
 6 3       2       13         31 63.27%    
 7 13      100     13         13 26.53%    
 8 14      100     13         11 22.45%    
 9 15      100     13         25 51.02%    
10 1       1002    13          9 18.37%  

每个主题的每个块,我想删除百分比在另一个条目的 10% 以内的行。所以在这种情况下,上面的条目 7 和 8 将被删除。

期望的输出

   Stimuli Subject Block TChosen Percentage
   <fct>   <fct>   <fct>   <int> <chr>     
 1 1       1       13          7 14.29%    
 2 2       1       13         18 36.73%    
 3 3       1       13         24 48.98%    
 4 1       2       13          3 6.12%     
 5 2       2       13         15 30.61%    
 6 3       2       13         31 63.27%       
 7 15      100     13         25 51.02%    
 8 1       1002    13          9 18.37%  

谢谢!

【问题讨论】:

  • 为什么保留第 9 行?另一个条目还是下一个条目?
  • 这个问题相当复杂。结果可能取决于删除的顺序(如果我们逐行进行,则可能取决于行的顺序)。
  • 我同意这可能会根据您对数据的排序方式产生不同的结果(假设您使用 Ronak 的滞后/领先代码)。当您的范围中有多个值时,指定是否最好保留最高或最低(或其他)值会很有用。

标签: r dplyr dt


【解决方案1】:

你可以试试这个方法:

library(dplyr)

df %>%
  mutate(Percentage = readr::parse_number(Percentage)) %>%
  arrange(Subject, Block, Percentage) %>%
  group_by(Subject, Block) %>%
  filter(Percentage - lag(Percentage, default = -Inf) > 10 & 
         lead(Percentage, default = Inf) - Percentage > 10) %>%
  ungroup

#  Stimuli Subject Block TChosen Percentage
#    <int>   <int> <int>   <int>      <dbl>
#1       1       1    13       7      14.3 
#2       2       1    13      18      36.7 
#3       3       1    13      24      49.0 
#4       1       2    13       3       6.12
#5       2       2    13      15      30.6 
#6       3       2    13      31      63.3 
#7      15     100    13      25      51.0 
#8       1    1002    13       9      18.4 

Percentage 转换为数字,并在每个SubjectBlock 中保留大于其上一个值和下一个值的10% 的行。

数据

df <- structure(list(Stimuli = c(1L, 2L, 3L, 1L, 2L, 3L, 13L, 14L, 
15L, 1L), Subject = c(1L, 1L, 1L, 2L, 2L, 2L, 100L, 100L, 100L, 
1002L), Block = c(13L, 13L, 13L, 13L, 13L, 13L, 13L, 13L, 13L, 
13L), TChosen = c(7L, 18L, 24L, 3L, 15L, 31L, 13L, 11L, 25L, 
9L), Percentage = c("14.29%", "36.73%", "48.98%", "6.12%", "30.61%", 
"63.27%", "26.53%", "22.45%", "51.02%", "18.37%")), 
class = "data.frame", row.names = c(NA, -10L))

【讨论】:

  • 如果在一组中你有一个像 10%、50%、12% 这样的百分比序列,这可能不起作用。也许这可以通过在每个组中按百分比排序来解决?
  • 没错。同样在纠正这个问题时,我意识到我以前的方法是不正确的。我已经解决了这两个问题。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-24
  • 2020-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-12
  • 1970-01-01
相关资源
最近更新 更多