【问题标题】:R - Creating new columns based on multiple conditions and time of eventR - 根据多个条件和事件时间创建新列
【发布时间】:2020-09-03 17:09:52
【问题描述】:

我需要根据以前列的多个条件和时间点创建新列。我有以下数据框:

table <- data.frame(RowID=c("A1", "A2", "A3", "A4", "A5", "A6", "A7", "A8", "A9", "A10", "A11", "A12", "A13", "A14", "A15"), Machine=c("Ace", "Ace", "Ace", "Ame", "Ame", "Cay", "Cay", "Cay", "Cay", "Cay", "Gap", "Gap", "Dex", "Dex", "Dex"), Time=c(1,2,3,1,2,1,2,3,4,5,1,2,1,2,3), Status=c("Good", "Good", "Bad", "Bad", "Good", "Good", "Bad", "Good", "Good", "Bad", "Good", "Good", "Bad", "Bad", "Good"))

print(table)
 RowID Machine Time Status
1     A1     Ace    1   Good
2     A2     Ace    2   Good
3     A3     Ace    3    Bad
4     A4     Ame    1    Bad
5     A5     Ame    2   Good
6     A6     Cay    1   Good
7     A7     Cay    2    Bad
8     A8     Cay    3   Good
9     A9     Cay    4   Good
10   A10     Cay    5    Bad
11   A11     Gap    1   Good
12   A12     Gap    2   Good
13   A13     Dex    1    Bad
14   A14     Dex    2    Bad
15   A15     Dex    3   Good

对于每台机器时间会显示读数的时间。我想创建两个新列 VerdictOutcome。对于 Verdict 列,我想为任何在“Bad”之前状态为“Good”的机器(例如 Ace 和 Cay)标记为“YES”,否则标记为“NO”。对于结果列,我想在机器第一次出现“Bad”状态时标记“Event”,在“Bad”状态出现之前将“BeforeEvent”标记为“Good”状态。对于不直接位于“Bad”之前的任何其他“Good”状态,标记为“Before”,并将第一个“Bad”状态之后的任何状态标记为“After”。

我希望得到的最终数据框如下:

table_new <- data.frame(RowID=c("A1", "A2", "A3", "A4", "A5", "A6", "A7", "A8", "A9", "A10", "A11", "A12", "A13", "A14", "A15"), Machine=c("Ace", "Ace", "Ace", "Ame", "Ame", "Cay", "Cay", "Cay", "Cay", "Cay", "Gap", "Gap", "Dex", "Dex", "Dex"), Time=c(1,2,3,1,2,1,2,3,4,5,1,2,1,2,3), Status=c("Good", "Good", "Bad", "Bad", "Good", "Good", "Bad", "Good", "Good", "Bad", "Good", "Good", "Bad", "Bad", "Good"), Verdict=c("YES", "YES", "YES", "NO", "NO", "YES", "YES", "YES", "YES", "YES", "NO", "NO", "NO", "NO", "NO"), Outcome=c("Before", "BeforeEvent", "Event", "None", "None", "BeforeEvent", "Event", "After", "After", "After", "None", "None", "None", "None", "None"))

print(table_new)
   RowID Machine Time Status Verdict     Outcome
1     A1     Ace    1   Good     YES      Before
2     A2     Ace    2   Good     YES BeforeEvent
3     A3     Ace    3    Bad     YES       Event
4     A4     Ame    1    Bad      NO        None
5     A5     Ame    2   Good      NO        None
6     A6     Cay    1   Good     YES BeforeEvent
7     A7     Cay    2    Bad     YES       Event
8     A8     Cay    3   Good     YES       After
9     A9     Cay    4   Good     YES       After
10   A10     Cay    5    Bad     YES       After
11   A11     Gap    1   Good      NO        None
12   A12     Gap    2   Good      NO        None
13   A13     Dex    1    Bad      NO        None
14   A14     Dex    2    Bad      NO        None
15   A15     Dex    3   Good      NO        None

非常感谢您对此的任何帮助,因为我需要多次重复此操作,所以如果它可以自动化,那就太好了 - 谢谢!

【问题讨论】:

  • 描述与数据不符。你是说 ...我想在“坏”之前为任何具有“良好”状态的机器标记“是”(例如 Ace 和 Cay),否则标记为“否”... 我们如何在带有Bad 的行上获得YES(例如A3、A7、A10)。请更准确地重新制定条件。
  • @Dan Verdict 列的目的是轻松提取具有“BeforeEvent”和“Event”的任何机器的所有行。因此,只要特定机器在“坏”状态之前具有“良好”状态,那么该机器的所有行都应标记为“是”,无论该特定机器的特定行的状态是“好”还是“坏” "。

标签: r if-statement dplyr


【解决方案1】:

这是一个可以尝试的示例(使用my_table)。目前尚不清楚您是否可能有多次从好到坏的转换,或者您可能希望如何处理。

首先,group_by 机器。我会考虑一个事件,其中前一行是“好”,当前行是“坏”。发生这种情况时,可以使用布尔值进行标记。

如果组内的任何值对于 Event 来说是 TRUE,则 Verdict 将被标记为“YES”,否则它将被标记为“NO”。

使用case_when,您可以指示将机器组中的行号与事件首次发生时间进行比较的结果(使用min,以防组内有多个转换)。

希望对你有帮助。

library(dplyr)

my_table %>%
  group_by(Machine) %>%
  mutate(Event = ifelse(lag(Status, default = "Bad") == "Good" & Status == "Bad", TRUE, FALSE),
         Verdict = ifelse(any(Event), "YES", "NO"),
         Outcome = ifelse(Verdict == "NO", "None",
           case_when(
             row_number() + 1 < min(which(Event)) ~ "Before",
             row_number() < min(which(Event)) ~ "BeforeEvent",
             row_number() == min(which(Event)) ~ "Event",
             row_number() > min(which(Event)) ~ "After"
           )))

输出

   RowID Machine  Time Status Event Verdict Outcome    
   <chr> <chr>   <dbl> <chr>  <lgl> <chr>   <chr>      
 1 A1    Ace         1 Good   FALSE YES     Before     
 2 A2    Ace         2 Good   FALSE YES     BeforeEvent
 3 A3    Ace         3 Bad    TRUE  YES     Event      
 4 A4    Ame         1 Bad    FALSE NO      None       
 5 A5    Ame         2 Good   FALSE NO      None       
 6 A6    Cay         1 Good   FALSE YES     BeforeEvent
 7 A7    Cay         2 Bad    TRUE  YES     Event      
 8 A8    Cay         3 Good   FALSE YES     After      
 9 A9    Cay         4 Good   FALSE YES     After      
10 A10   Cay         5 Bad    TRUE  YES     After      
11 A11   Gap         1 Good   FALSE NO      None       
12 A12   Gap         2 Good   FALSE NO      None       
13 A13   Dex         1 Bad    FALSE NO      None       
14 A14   Dex         2 Bad    FALSE NO      None       
15 A15   Dex         3 Good   FALSE NO      None 

数据

my_table <- structure(list(RowID = c("A1", "A2", "A3", "A4", "A5", "A6", 
"A7", "A8", "A9", "A10", "A11", "A12", "A13", "A14", "A15"), 
    Machine = c("Ace", "Ace", "Ace", "Ame", "Ame", "Cay", "Cay", 
    "Cay", "Cay", "Cay", "Gap", "Gap", "Dex", "Dex", "Dex"), 
    Time = c(1, 2, 3, 1, 2, 1, 2, 3, 4, 5, 1, 2, 1, 2, 3), Status = c("Good", 
    "Good", "Bad", "Bad", "Good", "Good", "Bad", "Good", "Good", 
    "Bad", "Good", "Good", "Bad", "Bad", "Good")), class = "data.frame", row.names = c(NA, 
-15L))

【讨论】:

    猜你喜欢
    • 2021-03-18
    • 1970-01-01
    • 1970-01-01
    • 2020-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    相关资源
    最近更新 更多