【问题标题】:Remove rows within a group if conditions of another row are met如果满足另一行的条件,则删除组内的行
【发布时间】:2018-07-02 22:52:59
【问题描述】:

我有一个数据框 df(+/- 331000 个观测值,有 4 个变量)和 Date(格式范围 = "%Y-%m-%d"),ID(因子19 级)、Station(18 级因子)和Presence1/0)。 数据框的设置方式是,每个ID 的每个Station 都有一个日期范围(超过近三年的时间),以及在特定日期是否有人在场(1/0)一个特定的车站。

如果根据日期和 ID 对 df 进行子集化/过滤,您将获得以下数据集(从现在开始我将其称为“组”):

filter(df, Date == "2016-01-03" & ID == "Fred")
 Date           ID     Station       Presence
 <date>         <fct>  <fct>         <dbl>
 2016-01-03     Fred   Station1      0 
 2016-01-03     Fred   Station2      0 
 2016-01-03     Fred   Station3      0 
 2016-01-03     Fred   Station4      1
 2016-01-03     Fred   Station5      0 
 2016-01-03     Fred   Station6      0 
 2016-01-03     Fred   Station7      0 
 2016-01-03     Fred   Station8      0 
 2016-01-03     Fred   Station9      0 
 2016-01-03     Fred   Station10     0 
 2016-01-03     Fred   Station11     0 
 2016-01-03     Fred   Station12     0 
 2016-01-03     Fred   Station13     0
 2016-01-03     Fred   Station14     0 
 2016-01-03     Fred   Station15     0 
 2016-01-03     Fred   Station16     0 
 2016-01-03     Fred   Station17     0 
 2016-01-03     Fred   Station18     0 

如果满足以下条件,我想从组中删除行: 对于每个组,如果df$Presence == 1,则删除带有df$Presence == 0 的行(一个组内可能有多个df$Presence == 1 的行,例如Fred 在2016 年1 月6 日在Station4、Station9 和Station 15)。但是如果组内没有df$Presence == 1 的行,请不要删除任何行(所以我不能简单地删除所有df$Presence == 0 行)。

因此,上述组将变为:

 Date         ID      Station    Presence
 <date>       <fct>   <fct>      <dbl>
 2016-01-03   Fred    Station4   1

但是,以下组将保持原样(因为组内没有Presence == 1):

filter(df, Date== "2016-01-03" & ID == "Mark")
 Date       ID    Station    Presence
 <date>     <fct> <fct>      <dbl>
 2016-01-03 Mark Station1    0 
 2016-01-03 Mark Station2    0 
 2016-01-03 Mark Station3    0 
 2016-01-03 Mark Station4    0
 2016-01-03 Mark Station5    0 
 2016-01-03 Mark Station6    0 
 2016-01-03 Mark Station7    0 
 2016-01-03 Mark Station8    0 
 2016-01-03 Mark Station9    0 
 2016-01-03 Mark Station10   0 
 2016-01-03 Mark Station11   0 
 2016-01-03 Mark Station12   0 
 2016-01-03 Mark Station13   0 
 2016-01-03 Mark Station14   0 
 2016-01-03 Mark Station15   0 
 2016-01-03 Mark Station16   0 
 2016-01-03 Mark Station17   0 
 2016-01-03 Mark Station18   0 

我想过从

开始
df %>%
  group_by(Date, ID) %>%

但是,我不知道如何从那里着手。我不知道如何处理对比条件。

【问题讨论】:

  • 寻求帮助时,您应该包含一个简单的reproducible example,其中包含可用于测试和验证可能解决方案的示例输入和所需输出。制作一个较小的数据集,我们可以复制/粘贴到 R 中进行测试。您可能只需要一个 group_by 和一个 any(Presence==1) &amp; (Presence==0) 来删除行。

标签: r


【解决方案1】:
library(tidyverse)
dat%>%
   group_by(Date,ID)%>%
   filter(all(Presence==0)|Presence==1)

# A tibble: 19 x 4
# Groups:   Date, ID [2]
   Date       ID    Station   Presence
   <chr>      <chr> <chr>        <int>
 1 2016-01-03 Fred  Station4         1
 2 2016-01-03 Mark  Station1         0
 3 2016-01-03 Mark  Station2         0
 4 2016-01-03 Mark  Station3         0
 5 2016-01-03 Mark  Station4         0
 6 2016-01-03 Mark  Station5         0
 7 2016-01-03 Mark  Station6         0
 8 2016-01-03 Mark  Station7         0
 9 2016-01-03 Mark  Station8         0
10 2016-01-03 Mark  Station9         0
11 2016-01-03 Mark  Station10        0
12 2016-01-03 Mark  Station11        0
13 2016-01-03 Mark  Station12        0
14 2016-01-03 Mark  Station13        0
15 2016-01-03 Mark  Station14        0
16 2016-01-03 Mark  Station15        0
17 2016-01-03 Mark  Station16        0
18 2016-01-03 Mark  Station17        0
19 2016-01-03 Mark  Station18        0

【讨论】:

    猜你喜欢
    • 2021-06-06
    • 2015-10-13
    • 1970-01-01
    • 2023-02-15
    • 2020-09-11
    • 1970-01-01
    • 1970-01-01
    • 2019-11-23
    • 1970-01-01
    相关资源
    最近更新 更多