2016-07-16 3 views
0

Я получил данные транзакции поездки набор, как это (около 560000 поездки): dataframe 1Как обеспечить еженедельный профиль с помощью R?

ID  START TIME   DATE   ORIGIN DESTINATION  DAY 
1005   9.10   2012-01-02   A  B   Monday 
1005   18.15   2012-01-02   B  A   Monday 
1005   9.05   2012-01-08   A  B   Sunday 
1005   17.05   2012-01-08   B  A   Sunday 
1010   8.00   2012-01-09   A  C   Monday 
1010   12.00   2012-01-09   C  A   Monday 
1013   13.15   2012-01-10   D  E   Tuesday 
1013   15.30   2012-01-10   E  G   Tuesday 
1013   9.06   2012-01-12   D  E   Thursday 
...   ...   2012-..-..   .  .   ... 

и индекс ID, как это (примерно 1986 идентификаторами): Dataframe 2

ID 
1005 
1010 
1013 
1015 
1030 
1034 
1036 
1031 
1040 
... 

Я хочу, чтобы создать еженедельный профиль путешествия, основанный на этих двух кадрах данных. Я не уверен ли я прав, но я попробовал эти коды:

weekday = c("Sunday", "Monday","Tuesday", "Wednesday", "Thursday", "Friday", "Saturday") 
    br = seq(0,23,by=1) 
ranges = paste(head(br,-1), br[-1], sep="_") 

      for (i in dataframe2$ID) { 

        for (n in weekday){ 
        x= filter(dataframe1,dataframe1$ID %in% i & dataframe1$DAY %in% n) 
        freq = hist(as.numeric(x), br, include.lowest=TRUE, plot=FALSE) 
        df = as.data.frame(t(data.frame(frequency = freq$counts))) 
        df$i = i 
        df$n = n 
        colnames(df) = c(as.character(ranges),"ID","Day") 
        write.table(head(df),file="testdata1.csv", append=TRUE,sep=",",col.names=FALSE,row.names=FALSE) 
        } 
       } 

Я хочу закончить с таблицей CSV, содержащий их еженедельную частоту срабатывания. Я также хочу спросить, есть ли простой способ упростить эту задачу.

ID  0_1 1_2 2_3 3_4 4_5 5_6 6_7 7_8 8_9 9_10 10_11 11_12 12_13 13_14 14_15 15_16 16_17 17_18 18_19 19_20 20_21 21_22 22_23 Day 
1005 0 0 0 0 0 0 0 0 0 1  0  0  0  0  0  0  0  1  0  0  0  0  0 Sunday 
1005 0 0 0 0 0 0 0 0 0 1  0  0  0  0  0  0  0  1  0  0  0  0  0 Monday 
1005 0 0 0 0 0 0 0 0 0 0  0  0  0  0  0  0  0  0  0  0  0  0  0 Tuesday 
1005                               Wednesday 
1005                               Thursday 
1005                               Friday 
1005                              Saturday 
1010                               Sunday 
1010 
1010 
1010 
1010 
1010 
1010 

в конце концов, я хочу, чтобы произвести схему так: enter image description here

+0

это лучше, если вы 'dput' данные –

ответ

1

Это может быть сделано в базе R с помощью функции xtabs, но она может быть немного более ясной, если мы делаем это с помощью dplyr и tidyr. При таком подходе weekday создается как переменная фактора R. Функция dplyrmutate затем используется для преобразования DAY в коэффициент и START_TIME в целое число. Затем мы используем complete из пакета tidyr для создания нового расширенного фрейма данных со строкой для каждого значения ID, DAY и START_TIME, используя их полный диапазон значений (например, строка для каждого ID, для каждого времени начала в 0:23 , и каждый день недели значение для DATE, используются ORIGIN и DESTINATION где они существуют;. в противном случае DATE, ORIGIN, и DESTINATION столбцов имеет NA значения количества поездок в ID, DAY, и START_TIME, вычисляется как сумма строк, которые. не имеют NA для значения DATE и хранятся в Freq. Функция spread от tidyr используется для преобразования каждого отдельного значения Freq в отдельный столбец. Наконец, назначаются имена соответствующих столбцов, столбцы упорядочены в запрошенный порядок и кадр данных, записанный в файл как csv.

library(dplyr) 
    library(tidyr) 
# 
# input data is in df 
# convert colunm name START TIME to syntactically correct version START_TIME 
# 
    colnames(df)[2] <- "START_TIME" 
# 
# define weekday as a factor with the days of week 
# 
    weekday <- c("Sunday", "Monday","Tuesday", "Wednesday", "Thursday", "Friday", "Saturday") 
    weekday <- factor(weekday, levels=weekday) 
# 
# sum number for trips by ID, DAY, and START_TIME 
# 
    trip_freq <- df %>% mutate(DAY = factor(DAY, levels=levels(weekday)), 
           START_TIME=floor(START_TIME)) %>% 
         complete(ID, DAY=weekday, START_TIME=0:23) %>% 
         group_by(ID, DAY, START_TIME) %>% 
         summarise(Freq = sum(!is.na(DATE))) 
    trip_freq_tbl <- trip_freq %>% spread(key = START_TIME, value=Freq) 
# 
# name and re-arrange columns 
# 
    colnames(trip_freq_tbl) <- c("ID", "Day", paste(0:23,1:24,sep="_")) 
    trip_freq_tbl <- cbind(trip_freq_tbl[,-2], Day=trip_freq_tbl[,"Day"])    
# 
# write trip_freq as csv fle 
# 
    write.table(trip_freq_tbl, file="testdata1.csv", sep=",", row.names=FALSE)  

Далее можно суммировать данные для вашего участка с

# 
# summarize the data for the plot 
# 
    trip_freq_plot <- trip_freq %>% group_by(DAY, START_TIME) %>% 
            summarize(Cnt = sum(Freq)) 

 Смежные вопросы

  • Нет связанных вопросов^_^