簡體   English   中英

根據 R 中兩列的范圍為列賦值

[英]Assign Value to Column Based on Range of Two Columns in R

我正在嘗試根據兩列時間為新列(工作時間)分配 TRUE 或 FALSE。 當時間在某個范圍內時,我想聲明為 TRUE,當時間超出該范圍時,我想聲明為 FALSE。 我正在使用以下代碼 - 但在正確分配 TRUE/FALSE 值時遇到問題:

我的 df 被稱為 ALLOBS,列 From 包含開始的時間,列 To 包含完成的時間。

     Date     From    To          Location                Working Hours
1   1/28/2010 00:00   07:45        No Location            NA
2    3/2/2010 07:45   16:30        Kahana                 NA
3    3/3/2010 08:00   16:15        Waikiki                NA
4    3/4/2010 09:00   16:45        Kahana                 NA
5    3/5/2010 16:31   00:00        No Location            NA
6    3/6/2010 12:00   13:15        Waikiki                NA
7    3/7/2010 13:14   16:31        Kahana                 NA
8    3/8/2010 07:00   12:00        Honolulu               NA

當時間在 07:30 (From) 和 16:30 (To) 之間時,我想寫 TRUE,當時間在 16:31 (To) 和 07:29 (From) 之間時寫 FALSE。 謝謝!

對您的數據是什么樣子以及您希望下面的兩個選項中的哪一個做出一些假設。 使用dplyrlubridate

問題是如何處理第 5 行,其中From肯定在 07:30 之后,而To在技​​術上在 16:30 之前(盡管它可能意味着第二天的 00:00 或同一天的 23:59?

ALLOBS
#>        Date  From    To    Location
#> 1 1/28/2010 00:00 07:45 No Location
#> 2  3/2/2010 07:45 16:30      Kahana
#> 3  3/3/2010 08:00 16:15     Waikiki
#> 4  3/4/2010 09:00 16:45      Kahana
#> 5  3/5/2010 16:31 00:00 No Location
#> 6  3/6/2010 12:00 13:15     Waikiki
#> 7  3/7/2010 13:14 16:31      Kahana
#> 8  3/8/2010 07:00 12:00    Honolulu

選項 #1 是我認為您想要通過檢查From < 16:31 使第 5 行FALSE

library(dplyr)
library(lubridate)

ALLOBS %>%
   mutate(Working_hours =
             hms(paste0(From, ":00")) >= hms("07:30:00") &
             hms(paste0(To, ":00")) < hms("16:31:00") &
             hms(paste0(From, ":00")) < hms("16:30:00")
   )
#>        Date  From    To    Location Working_hours
#> 1 1/28/2010 00:00 07:45 No Location         FALSE
#> 2  3/2/2010 07:45 16:30      Kahana          TRUE
#> 3  3/3/2010 08:00 16:15     Waikiki          TRUE
#> 4  3/4/2010 09:00 16:45      Kahana         FALSE
#> 5  3/5/2010 16:31 00:00 No Location         FALSE
#> 6  3/6/2010 12:00 13:15     Waikiki          TRUE
#> 7  3/7/2010 13:14 16:31      Kahana         FALSE
#> 8  3/8/2010 07:00 12:00    Honolulu         FALSE

選項 #2 省略了檢查,因此得出TRUE

ALLOBS %>%
   mutate(Working_hours = hms(paste0(From, ":00")) > hms("07:30:00") &
             hms(paste0(To, ":00")) < hms("16:31:00"))
#>        Date  From    To    Location Working_hours
#> 1 1/28/2010 00:00 07:45 No Location         FALSE
#> 2  3/2/2010 07:45 16:30      Kahana          TRUE
#> 3  3/3/2010 08:00 16:15     Waikiki          TRUE
#> 4  3/4/2010 09:00 16:45      Kahana         FALSE
#> 5  3/5/2010 16:31 00:00 No Location          TRUE
#> 6  3/6/2010 12:00 13:15     Waikiki          TRUE
#> 7  3/7/2010 13:14 16:31      Kahana         FALSE
#> 8  3/8/2010 07:00 12:00    Honolulu         FALSE

你的數據(我認為)

ALLOBS <- data.frame(
   Date = c("1/28/2010", "3/2/2010", "3/3/2010",
            "3/4/2010", "3/5/2010", "3/6/2010",
            "3/7/2010", "3/8/2010"),
   From = c("00:00", "07:45", "08:00", "09:00", "16:31",
            "12:00", "13:14", "07:00"),
   To = c("07:45", "16:30", "16:15", "16:45", "00:00",
          "13:15", "16:31", "12:00"),
   Location = c("No Location","Kahana", "Waikiki", "Kahana",
                "No Location", "Waikiki", "Kahana", "Honolulu")
)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM