2017-01-30 3 views
0

データセットの例:AからBへ、または逆の順序で移動したデータセット。私は以下のコードに従って私が行った私の旅行パスをプロットしたいと思います。さらに、BとCの距離がAとBよりも大きいことを示すために、yスケールを幾分持っていきたいと思います。旅行ルートはすべての人にとって等しいとみなすことができます。また、私のループのためのいくつかのフィードバックと代替ソリューションに感謝します。ループの回避とggplotのスケールの変更とプロット

マイコード:

library(ggplot2) 

df <- data.frame(Checkpoint = rep(c("A", "B", "C"), 3), 
       Route = as.factor(rep(1:3, each = 3)), 
       Times = as.POSIXct(c("4:10", "4:25", "5:00", "8:00", "8:22", 
             "9:00","10:00", "10:15", "10:50"), format = "%H:%M")) 

df[7:9,1] <- rev(df[7:9,1]) 

# If travelled from A to C, then F1, F2 

df$Direction <- NA 

for(i in 1:length(levels(df$Route))){ 

    y <- which(df$Route == i) 
    x <- filter(df, Route == i) 

    l <- ifelse(x[x$Checkpoint == "A", "Times"] < x[x$Checkpoint == "B", "Times"], "F1", "F2") 

    df$Direction[y] <-l 

} ; rm(y,x,l,i) 


ggplot(df, aes(x=Times, color = Route, y= Checkpoint, group=Route)) + 
    geom_line() + 
    theme_light() 
+0

? –

+0

私はこのプロットが何であるか分かりませんが、スケールを変更するのではなく、チェックポイント(およその見積もり)とプロットの距離(x)と時間(y)の間の距離を取得する方が論理的でしょうか? – Wave

+0

@Waveまさに私がやりたいことです。しかし、私はY軸上にチェックポイントA/B/Cを残したいと思っています。 – MLEN

答えて

0
diff <- df[1:3,] 
diff$time <- diff$Times - diff$Times[1] 
diff <- diff[,c(1,5)] 

df <- merge(df, diff) 
df$time <- as.numeric(df$time) 


ggplot(df, aes(x=Times, color = Route, y= time, group=Route)) + 
    geom_line() + 
    scale_y_continuous(breaks = unique(df$time), labels = c("A","B","C")) + 
    theme_light() 
0

あなたは、それはより速くあなたがループ内で繰り返し複数回、あなたのデータをsubsetする必要がないので、あるべきsplitを使用して、次のコードで、あなたのfor loopを置き換えることができ、

df <- do.call(rbind, lapply(split(df, df$Route), 
     function(x) { 
     x['Direction'] <- ifelse(x[x['Checkpoint'] == "A", "Times"] < x[x['Checkpoint'] == "B", "Times"], "F1", "F2") 
     x})) 

次のような出力が得られるはずです。

Checkpoint Route    Times Direction 
1.1   A  1 2017-01-31 04:10:00  F1 
1.2   B  1 2017-01-31 04:25:00  F1 
1.3   C  1 2017-01-31 05:00:00  F1 
2.4   A  2 2017-01-31 08:00:00  F1 
2.5   B  2 2017-01-31 08:22:00  F1 
2.6   C  2 2017-01-31 09:00:00  F1 
3.7   C  3 2017-01-31 10:00:00  F2 
3.8   B  3 2017-01-31 10:15:00  F2 
3.9   A  3 2017-01-31 10:50:00  F2 
0

またplyrパッケージを使用して、1行でこれを行うことができます:作図中に方向を使用している

library(plyr) 
ddply(df,c('Route'),transform,Direction=ifelse(Times[3]>Times[1]&Checkpoint[1]=='A','A->C','C->A')) 


    Checkpoint Route    Times Direction 
    1   A  1 2017-01-30 04:10:00  A->C 
    2   B  1 2017-01-30 04:25:00  A->C 
    3   C  1 2017-01-30 05:00:00  A->C 
    4   A  2 2017-01-30 08:00:00  A->C 
    5   B  2 2017-01-30 08:22:00  A->C 
    6   C  2 2017-01-30 09:00:00  A->C 
    7   C  3 2017-01-30 10:00:00  C->A 
    8   B  3 2017-01-30 10:15:00  C->A 
    9   A  3 2017-01-30 10:50:00  C->A 
関連する問題