R и фильтр, rbind

#r #filter

Вопрос:

Я изучаю R и занимаюсь каким-то проектом. Мне нужна фильтрация по многим значениям со временем, поэтому я написал ниже. Но произошла какая-то ошибка, и я не нашел решения. Мне нужна помощь.

Это список значений.

 divvy_trips <- c("divvy_trips_2013","divvy_trips_2014_Q1Q2","divvy_trips_2014_Q3_07","divvy_trips_2014_Q3_0809","divvy_trips_2014_Q4","divvy_trips_2015_Q1","divvy_trips_2015_Q2","divvy_trips_2015_07","divvy_trips_2015_08","divvy_trips_2015_09","divvy_trips_2015_Q4","divvy_trips_2016_Q1","divvy_trips_2016_04","divvy_trips_2016_05","divvy_trips_2016_06","divvy_trips_2016_Q3","divvy_trips_2016_Q4","divvy_trips_2017_Q1","divvy_trips_2017_Q2","divvy_trips_2017_Q3","divvy_trips_2017_Q4","divvy_trips_2018_Q1","divvy_trips_2018_Q2","divvy_trips_2018_Q3","divvy_trips_2018_Q4","divvy_trips_2019_Q1","divvy_trips_2019_Q2","divvy_trips_2019_Q3","divvy_trips_2019_Q4")


divvy_trip_days=NULL  
    for(i in divvy_trips){

        trip<-eval(parse(text=i))

        if ("starttime" %in% names(trip)){

            trip<-select(trip,usertype) %>%
               filter(((hour(starttime) >=6 amp; hour(stoptime) >=6) amp; (hour(starttime)<=10 amp; 
               hour(stoptime) <=10)) |((hour(starttime) >=16amp; hour(stoptime) >=16)amp; (hour(starttime)<=20 amp; hour(stoptime) <=20)))%>% 
               group_by(usertype,what_day = wday(starttime))%>% 
               summarise(count=n())
         }
         divvy_trip_days <- rbind(divvy_trip_days,trip)
         print(str(i))
  }
 

Ошибка: Проблема с filter() вводом ..1 .
я ввожу ..1 это |... .
x объект «время начала» не найден

Комментарии:

1. select(trip,usertype) выбирает только столбец usertype из trip . Других столбцов не будет (так что также не будет столбца с именем starttime). Кроме того, я бы посоветовал разобраться get .

2. благодарить. вы думаете, что используете select() с такими столбцами,как starttime, stoptime и так далее?

3. Не уверен, зачем вам вообще здесь нужен выбор, но да, если вы решите использовать выбор, вам нужно выбрать все столбцы, которые вы хотите использовать

4. Я думаю, что выбор какого — то столбца позволит сократить время вычислений. но вы знаете, что в этом нет необходимости?

Ответ №1:

Трудно ответить без образца или подробной информации о ваших данных, но вы можете попробовать —

 library(dplyr)
library(purrr)
library(lubridate)

mget(divvy_trips) %>%
  map_df(~{
    if ("starttime" %in% names(.x)){
    .x <- .x %>%
      filter(((hour(starttime) >=6 amp; hour(stoptime) >=6) amp; 
                (hour(starttime)<=10 amp; hour(stoptime) <=10)) |
               ((hour(starttime) >=16 amp; hour(stoptime) >=16) amp; 
                (hour(starttime)<=20 amp; hour(stoptime) <=20))) %>% 
      count(usertype,what_day = wday(starttime), name = 'count')
    }
    .x
  }) -> divvy_trip_days

divvy_trip_days
 

Если все divvy_trips фреймы данных содержат столбец starttime , вы можете пропустить этот if шаг.