调查中的时间戳将所有数据分组到StartTime下的一列中,但是我需要将数据分为AM和PM组。

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

8:37 PM
3:58 PM
10:22 AM
2:48 PM
6:33 PM
7:10 AM
10:59 AM


但我需要将其分为

8:37 PM  10:22 AM
3:58 PM  7:10 AM
2:48 PM 10:59 AM
6:33 PM


有关如何执行此操作的任何想法?谢谢

最佳答案

您可以使用split

split(df1, grepl('PM', df1$StartTime))


如果需要获取包含两列的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


要么

 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


或使用dplyr/tidyr

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


数据

 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))

关于r - R:如何将列表拆分为AM/PM,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30550928/

10-12 17:00