35

Rを使用していくつかのデータをプロットしています。

Date <- c("07/12/2012 05:00:00", "07/12/2012 06:00:00", "07/12/2012 07:00:00",
      "07/12/2012 08:00:00","07/12/2012 10:00:00","07/12/2012 11:00:00")
Date <- strptime(Date, "%d/%m/%Y %H:%M")
Counts <- c("0","3","10","6","5","4")
Counts <- as.numeric(Counts)
df1 <- data.frame(Date,Counts,stringsAsFactors = FALSE)
library(ggplot2)
g = ggplot(df1, aes(x=Date, y=Counts)) + geom_line(aes(group = 1))
g

時間の切れ目があるときにデータを実線としてプロットしないようにRに依頼するにはどうすればよいですか?私は通常1時間ごとにデータポイントを持っていますが、時々休憩があります(午前8時から午前10時の間)。これらの点の間で、私は線を接続したくありません。これはRで可能ですか?

編集

ここでの回答に感謝します。私のデータは現在10秒間隔であり、このデータを使用して同じ分析を行いたいと思います。

df <- structure(list(Date = c("11/12/2012", "11/12/2012", "11/12/2012", 
                     "11/12/2012", "11/12/2012", "11/12/2012", "11/12/2012", 
                     "11/12/2012", "11/12/2012", "11/12/2012", "11/12/2012"),
                     Time = c("20:16:00", "20:16:10", "20:16:20", "20:16:30", 
                     "20:16:40", "20:16:50", "20:43:30", "20:43:40", 
                     "20:43:50", "20:44:00", "20:44:10"),
                     Axis1 = c(181L, 14L, 65L, 79L, 137L, 104L, 7L, 0L, 0L, 
                     14L, 0L),
                     Steps = c(13L, 1L, 6L, 3L, 8L, 4L, 1L, 0L, 0L, 0L, 0L)),
                .Names = c("Date", "Time", "Axis1", "Steps"),
                row.names = c(57337L, 57338L, 57339L, 57340L, 57341L, 57342L, 
                57502L, 57503L, 57504L, 57505L, 57506L), class = "data.frame")

元のデータフレームに「グループ」列を追加すると、コードが何をしようとしているのか理解できると思いますが、私の質問は、データが10秒間隔になっていることをRに知らせる方法に関するものですか?コードの最初の行を適用して、数値が連続しているかどうか、またはギャップがあるかどうかを判断すると(たとえば、idx <-c(1、diff(df $ Time))、次のエラーが発生します。

r[i1]のエラー--r[-length(r):-( length(r)--lag + 1L)]:二項演算子への非数値引数

変数の後に、時間を正しく認識できるようTimeに追加する必要がありますか?as.POSIXct

4

3 に答える 3

25

group接続したいポイントに共通の値を設定して設定する必要があります。ここでは、最初の4つの値をsay1に設定し、最後の2つの値をに設定できます2。そして、それらを要因として保持します。あれは、

df1$grp <- factor(rep(1:2, c(4,2)))
g <- ggplot(df1, aes(x=Date, y=Counts)) + geom_line(aes(group = grp)) + 
                     geom_point()

編集:ロードしたら、次のコードを使用して列data.frameを自動的に生成できます。grp

idx <- c(1, diff(df$Date))
i2 <- c(1,which(idx != 1), nrow(df)+1)
df1$grp <- rep(1:length(diff(i2)), diff(i2))

注: data.frameの最後のエントリである場合はプロットされないため(線を接続する2つのポイントがないため) 、追加することも重要です。この場合、それをプロットします。geom_point()discontinuous rangegeom_point()

例として、より多くのギャップを持つデータを生成します。

# get a test data
set.seed(1234)
df <- data.frame(Date=seq(as.POSIXct("05:00", format="%H:%M"), 
                as.POSIXct("23:00", format="%H:%M"), by="hours"))
df$Counts <- sample(19)
df <- df[-c(4,7,17,18),]

# generate the groups automatically and plot
idx <- c(1, diff(df$Date))
i2 <- c(1,which(idx != 1), nrow(df)+1)
df$grp <- rep(1:length(diff(i2)), diff(i2))
g <- ggplot(df, aes(x=Date, y=Counts)) + geom_line(aes(group = grp)) + 
            geom_point()
g

ggplot2_groups

編集:新しいデータの場合(それがであると仮定してdf)、

df$t <- strptime(paste(df$Date, df$Time), format="%d/%m/%Y %H:%M:%S")

idx <- c(10, diff(df$t))
i2 <- c(1,which(idx != 10), nrow(df)+1)
df$grp <- rep(1:length(diff(i2)), diff(i2))

でプロットしaes(x=t, ...)ます。

于 2013-02-11T21:28:18.250 に答える
15

ggplot2で指定する以外に、Rやどこかに欠測データポイントがあるかどうかを知る方法はないと思いますNA。このように、例えば:

df1 <- rbind(df1, list(strptime("07/12/2012 09:00:00", "%d/%m/%Y %H:%M"), NA))
ggplot(df1, aes(x=Date, y=Counts)) + geom_line(aes(group = 1))

ここに画像の説明を入力してください

于 2013-02-11T21:29:04.087 に答える
6

NA休憩が必要な場所に明示的なを含めるというJubaの答えは、最良のアプローチです。これらを適切な場所に導入する別の方法を次に示しNAます(手動で把握する必要はありません)。

every.hour <- data.frame(Date=seq(min(Date), max(Date), by="1 hour"))
df2 <- merge(df1, every.hour, all=TRUE)
g %+% df2

ここに画像の説明を入力してください

df日付と時刻を適切な形式に変更した後、後の例と同様のことを行うことができます

df$DateTime <- as.POSIXct(strptime(paste(df$Date, df$Time), 
                                   format="%m/%d/%Y %H:%M:%S"))
every.ten.seconds <- data.frame(DateTime=seq(min(df$DateTime), 
                                             max(df$DateTime), by="10 sec"))
df.10 <- merge(df, every.ten.seconds, all=TRUE)
于 2013-02-19T20:18:35.977 に答える