簡體   English   中英

使用一列的一部分在R中子集數據集

[英]Subset a dataset in R using part of one column

詳細說明我的上一個問題:我想在R中對大型csv數據集進行子集化。我想獲取“時間戳”列的信息,並僅提取7pm到12 am(含)之間的時間間隔。 以下是數據示例:

Deer ID    TimeStamp         Location
1          4/16/18 12:00AM   DMA 1
2          4/16/18 3:00AM    DMA 1
3          4/16/18 9:30AM    DMA 2
4          4/16/18 7:00PM    DMA 1
5          4/16/18 8:30PM    DMA 2
6          4/16/18 11:00PM   DMA 3
7          4/17/18 1:30AM    DMA 2
8          4/17/18 5:00AM    DMA 1
9          4/17/18 9:00PM    DMA 3
10         4/17/18 11:30PM   DMA 1
11         4/18/18 12:30AM   DMA 2

因此,我的最終目標是最終獲得以下收益:

Deer ID     TimeStamp        Location
4           4/16/18 7:00PM   DMA 1
5           4/16/18 8:30PM   DMA 2
6           4/16/18 11:00PM  DMA 3
9           4/17/18 9:00PM   DMA 3
10          4/17/18 11:30PM  DMA 1

關於如何做到這一點的任何想法? 謝謝!

您可以執行以下操作

# Convert TimeStamp to POSIXct 
df <- transform(df, TimeStamp = strptime(TimeStamp, "%m/%d/%Y %I:%M%p"))

# Use lubridate::hour to extract the hours from the POSIXct timestamp
library(lubridate)
df[(hour(df$TimeStamp) >= 19 & hour(df$TimeStamp) <= 24), ]
#   Deer.ID           TimeStamp Location
#4        4 0018-04-16 19:00:00    DMA 1
#5        5 0018-04-16 20:30:00    DMA 2
#6        6 0018-04-16 23:00:00    DMA 3
#9        9 0018-04-17 21:00:00    DMA 3
#10      10 0018-04-17 23:30:00    DMA 1

樣本數據

df <- read.table(text =
    "'Deer ID'    TimeStamp         Location
1          '4/16/18 12:00AM'   'DMA 1'
2          '4/16/18 3:00AM'    'DMA 1'
3          '4/16/18 9:30AM'    'DMA 2'
4          '4/16/18 7:00PM'    'DMA 1'
5          '4/16/18 8:30PM'    'DMA 2'
6          '4/16/18 11:00PM'   'DMA 3'
7          '4/17/18 1:30AM'    'DMA 2'
8          '4/17/18 5:00AM'    'DMA 1'
9          '4/17/18 9:00PM'    'DMA 3'
10         '4/17/18 11:30PM'   'DMA 1'
11         '4/18/18 12:30AM'   'DMA 2'", header = T)

整潔的方式將遵循以下原則:

library(dplyr)
df <- read.table(
  text =
    "id    timestamp         location
                 1          '4/16/18 12:00AM'   'DMA 1'
                 2          '4/16/18 3:00AM'    'DMA 1'
                 3          '4/16/18 9:30AM'    'DMA 2'
                 4          '4/16/18 7:00PM'    'DMA 1'
                 5          '4/16/18 8:30PM'    'DMA 2'
                 6          '4/16/18 11:00PM'   'DMA 3'
                 7          '4/17/18 1:30AM'    'DMA 2'
                 8          '4/17/18 5:00AM'    'DMA 1'
                 9          '4/17/18 9:00PM'    'DMA 3'
                 10         '4/17/18 11:30PM'   'DMA 1'
                 11         '4/18/18 12:30AM'   'DMA 2'",
  header = TRUE
) %>%
  as_tibble()

df %>%
  mutate(timestamp = as.POSIXct(strptime(.data$timestamp, "%m/%d/%Y %I:%M%p"))) %>%
  filter(between(lubridate::hour(.data$timestamp), 19, 24))
#> # A tibble: 5 x 3
#>      id timestamp           location
#>   <int> <dttm>              <chr>   
#> 1     4 0018-04-16 19:00:00 DMA 1   
#> 2     5 0018-04-16 20:30:00 DMA 2   
#> 3     6 0018-04-16 23:00:00 DMA 3   
#> 4     9 0018-04-17 21:00:00 DMA 3   
#> 5    10 0018-04-17 23:30:00 DMA 1

reprex軟件包 (v0.2.1)創建於2019-02-19

暫無
暫無

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

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