R:如何将列表拆分为 AM/PM

Pat*_*ck5 5 split r filter

调查的时间戳将我的所有数据分组到“开始时间”下的一列中,但我需要将数据分为上午和下午组。

例如,现在我的数据看起来像

8:37 PM
3:58 PM
10:22 AM
2:48 PM
6:33 PM
7:10 AM
10:59 AM
Run Code Online (Sandbox Code Playgroud)

但我需要把它分成

8:37 PM  10:22 AM
3:58 PM  7:10 AM
2:48 PM 10:59 AM
6:33 PM
Run Code Online (Sandbox Code Playgroud)

关于如何做到这一点有什么想法吗?谢谢

akr*_*run 2

您可以使用split

split(df1, grepl('PM', df1$StartTime))
Run Code Online (Sandbox Code Playgroud)

如果您需要获取具有两列的 data.frame

 lst <- split(df1$StartTime, grepl('PM', df1$StartTime))
 setNames(data.frame(lapply(lst, `length<-`, max(lengths(lst)))),
                   c('AM', 'PM'))
 #       AM      PM
 #1 10:22 AM 8:37 PM
 #2  7:10 AM 3:58 PM
 #3 10:59 AM 2:48 PM
 #4     <NA> 6:33 PM
Run Code Online (Sandbox Code Playgroud)

或者

 library(data.table)#v1.9.5+
 dcast(setDT(df1)[, group:= c('AM', 'PM')[grepl('PM', StartTime)+1L]][,
           N:=1:.N, group], N~group, value.var='StartTime')
 #   N       AM      PM
 #1: 1 10:22 AM 8:37 PM
 #2: 2  7:10 AM 3:58 PM
 #3: 3 10:59 AM 2:48 PM
 #4: 4       NA 6:33 PM
Run Code Online (Sandbox Code Playgroud)

或者使用dplyr/tidyr

library(dplyr)
library(tidyr)
df1 %>% 
    extract(StartTime, into='AMPM', '[^ ]+\\s+([^ ]+)', remove=FALSE) %>%
    group_by(AMPM) %>%
    mutate(n=row_number()) %>% 
    spread(AMPM, StartTime)
Run Code Online (Sandbox Code Playgroud)

数据

 df1 <- structure(list(StartTime = c("8:37 PM", "3:58 PM", "10:22 AM", 
 "2:48 PM", "6:33 PM", "7:10 AM", "10:59 AM")), .Names = "StartTime",
  class = "data.frame", row.names = c(NA, -7L))
Run Code Online (Sandbox Code Playgroud)