【问题标题】:Using R to extract multiple rows from data frame based on change in values使用R根据值的变化从数据框中提取多行
【发布时间】:2020-09-08 10:54:38
【问题描述】:

我有一个温度随时间变化的数据框。我想确定温度升高降低 3 的 第一个实例,并提取这些行以随时间放入一个新数据帧和一个新列1 和 0 表示开和关。请看下面的例子:

原始数据框:

Date        Time        Temp
2020-01-01  18:00:00    2
2020-01-01  18:00:10    2
2020-01-01  18:00:20    2
2020-01-01  18:00:30    2
2020-01-01  18:00:40    2
2020-01-01  18:00:50    2
2020-01-01  18:01:00    6
2020-01-01  18:01:10    10
2020-01-01  18:01:20    12
2020-01-01  18:01:30    12
2020-01-01  18:01:40    12
2020-01-01  18:01:50    12
2020-01-01  18:02:00    12
2020-01-01  18:02:10    12
2020-01-01  18:02:20    12
2020-01-01  18:02:30    7
2020-01-01  18:02:40    5
2020-01-01  18:02:50    3
2020-01-01  18:03:00    2
2020-01-01  18:03:10    2
2020-01-01  18:03:20    2
2020-01-01  18:03:30    2
2020-01-01  18:03:40    2
2020-01-01  18:03:50    2
2020-01-01  18:04:00    2

新数据框:

Date        Time        On_Off
2020-01-01  18:01:00    1
2020-01-01  18:02:30    0

为此,我认为我需要创建一个空数据框,然后使用从原始数据中提取的时间填充它。谢谢!

【问题讨论】:

    标签: r dataframe for-loop if-statement conditional-statements


    【解决方案1】:

    您可以使用来自dplyrleadlag 来检查Temptop_n(也来自dplyr)的变化,以获取第一个实例。

    df %>%
      mutate(On_Off = case_when(Temp > lag(Temp) ~ "1",
                                Temp < lag(Temp) ~ "0",
                                TRUE ~ "No_Change")) %>% 
      filter(Temp > lag(Temp, default = 1) + 3 | Temp < lag(Temp) - 3) %>% 
      group_by(On_Off) %>% 
      top_n(1, wt = desc(Time)) %>% 
      select(Date, Time, On_Off)
    # A tibble: 2 x 3
    # Groups:   On_Off [2]
      Date       Time     On_Off
      <date>     <time>   <chr> 
    1 2020-01-01 18:01:00 1     
    2 2020-01-01 18:02:30 0     
    

    【讨论】:

    • 谢谢,@Greg!当温度升高/降低时,如果同一数据帧中有多个案例,您将如何处理?例如,如果有人在几周内记录熔炉的温度?
    • @finc 这样的事情应该适用于多种情况df %&gt;% mutate(On_Off = case_when(Temp &gt; lag(Temp) ~ "1", Temp &lt; lag(Temp) ~ "0", TRUE ~ "No_Change")) %&gt;% filter(Temp &gt; lag(Temp, default = 1) + 3 | Temp &lt; lag(Temp) - 3) %&gt;% filter((lead(On_Off, default = "No_Change") == On_Off) == FALSE) select(Date, Time, On_Off)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-26
    • 1970-01-01
    • 2014-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多