【问题标题】:Tag rows based on the conditions on 2 columns根据 2 列上的条件标记行
【发布时间】:2019-10-30 16:01:28
【问题描述】:

我有如下数据

    concat         Type   ddate      TTIME
1348 - 2019-06-10   B   6/10/2019   12:34:03
1348 - 2019-06-10   A   6/10/2019   12:38:02
1348 - 2019-06-10   B   6/10/2019   13:37:15
1348 - 2019-06-11   A   6/11/2019   14:35:20
1348 - 2019-06-11   B   6/11/2019   18:01:01
1348 - 2019-06-11   A   6/11/2019   18:02:42
1348 - 2019-06-11   B   6/11/2019   19:59:34

我正在尝试为 concat 组添加一个标签,如果最短时间 = A 类且最长时间 = B 类,则需要为 concat 组的所有行项目添加包含。否则需要将特定 concat 组的所有行项目标记为排除,如下所示:

       concat      Type   ddate       TTIME    Category
1348 - 2019-06-10   B   6/10/2019   12:34:03    Exclude
1348 - 2019-06-10   A   6/10/2019   12:38:02    Exclude
1348 - 2019-06-10   B   6/10/2019   13:37:15    Exclude
1348 - 2019-06-11   A   6/11/2019   14:35:20    Include
1348 - 2019-06-11   B   6/11/2019   18:01:01    Include
1348 - 2019-06-11   A   6/11/2019   18:02:42    Include
1348 - 2019-06-11   B   6/11/2019   19:59:34    Include

我尝试如下但无法生成所需的输出

df1 = df1 %>% 
arrange(concat, time) %>% 
group_by(concat) %>% 
mutate(
 Category = ifelse((TTIME == min(TTIME) & Type =="A") & (TTIME == max(TTIME) & Type =="B"),"Include","Exclude"))

【问题讨论】:

  • 尝试在两个测试之间的代码中使用或运算符 (|)。你有 & (and) 这意味着你不会有任何真值(你不能同时拥有 Type == "B" 和 Type == "A")
  • 但是如果我使用 or 运算符,如果满足任何条件,我可能会得到“包含”。 IE。即使 max(TTIME) == A,我最终也会得到 Include;对我来说,TTIME的最小值应该是A,TTIME的最大值应该是B(两个条件都需要满足)

标签: r datatable dplyr


【解决方案1】:

我会考虑将这些条件分开以使其更易于使用。

为了举例说明,您可以重新编码 min 的行,其中 TTIMEType == "A" (对于 maxType == "B" 类似)。

那么,要包含一个组,该组必须同时包含“A”和“B”。

这是否符合您的要求?

library(tidyverse)

df1 %>% 
  arrange(concat, TTIME) %>% 
  group_by(concat) %>%
  mutate(match = case_when(
    TTIME == min(TTIME) & Type == "A" ~ "A",
    TTIME == max(TTIME) & Type == "B" ~ "B")) %>%
  mutate(Category = ifelse(all(c("A", "B") %in% match), "Include", "Exclude"))

# A tibble: 7 x 6
# Groups:   concat [2]
  concat          Type  ddate     TTIME               match Category
  <fct>           <fct> <fct>     <dttm>              <chr> <chr>   
1 1348-2019-06-10 B     6/10/2019 2019-10-30 12:34:03 NA    Exclude 
2 1348-2019-06-10 A     6/10/2019 2019-10-30 12:38:02 NA    Exclude 
3 1348-2019-06-10 B     6/10/2019 2019-10-30 13:37:15 B     Exclude 
4 1348-2019-06-11 A     6/11/2019 2019-10-30 14:35:20 A     Include 
5 1348-2019-06-11 B     6/11/2019 2019-10-30 18:01:01 NA    Include 
6 1348-2019-06-11 A     6/11/2019 2019-10-30 18:02:42 NA    Include 
7 1348-2019-06-11 B     6/11/2019 2019-10-30 19:59:34 B     Include 

【讨论】:

  • 谢谢本;但是,我通过长时间拆分数据并合并回来来做到这一点,这对于前进的学习非常有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-22
  • 2021-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多