2017-06-09 16 views
0

私はいくつかの助けが必要です。私は現在、リニアモデルを毎時の電力価格に合わせようとしています。ですから、ダミーを作成することを考えていました。ダミーは、1日の時間が06:00から20:00の間であれば、値1をとります。残念ながら、私はこれまで苦労してきました。特定の時間のダミー変数を作成する

time.cet <- as.POSIXct(time.numeric, origin = "1970-01-01", tz=local.time.zone) 
hours.S <- strftime(time.cet, format = "%H:%M:%S", tz=local.time.zone) 
head(time.cet) 
[1] "2007-01-01 00:00:00 CET" "2007-01-01 01:00:00 CET" "2007-01-01 02:00:00 CET" 
[4] "2007-01-01 03:00:00 CET" "2007-01-01 04:00:00 CET" "2007-01-01 05:00:00 CET" 

私は、誰かが助けることを願っています。

+0

包括的であることを

library(dplyr) library(lubridate) A <- 6 B <- 20 between(hour(time.cet), A, B) [1] TRUE FALSE TRUE 

注意?どのようにあなたの出力をしたいですか? dateが既に他の場所に格納されているので、列の日付とそれに対応する0/1の値を持つdata.frame、または0/1のベクトルだけが必要ですか?してください、作業するいくつかのデータ/情報を提供しています... – digEmAll

答えて

1

ifelse()ステートメントは、ダミー変数を作成するのに便利な方法です。個人的に時間をかけて作業することについてはあまりよく分かりませんが、ダミー変数を作成すると、次のような形式になります。 dummy <- with(data, ifelse(time > 06:00 & time < 20:00, 1, 0) ここで、データはあなたのデータが何であれ、時間はあなたの時間が格納されている列です。時間が通常の数値ベクトルのように振る舞わないなら、少しでも条件を使いこなす必要があります(この目的のために仮定します)。

2

私は時間のカットオフをするとき、カットオフをオブジェクトとして作っています。このように、カットオフを変更する必要がある場合は、条件文の値ではなくオブジェクトの値を変更するほうが簡単です。

以下のマイコードでは、時間/日付の管理に最適なパッケージであるlubridate()を使用しています。

以下のコードは、ダミー変数を分析に組み込むために必要な情報を提供します。

### 
### Load Package 
### 

library(lubridate) 

### 
### Designate Time Cut-Offs 
### 

Beginning <- hms("06:00:00") 
End <- hms("20:00:00") 

### 
### Designate Test Cut-Offs 
### 

Test.1 <- hms("5:00:00") 
Test.2 <- hms("11:00:00") 

### 
### Test Conditional Logic 
### 
### Value will be 1 if time is between, value will be 0 if it is not. 
### 

ifelse(((Test.1 >= Beginning) & (Test.1 <= End)) , 1, 0) 

########## This should (and does) return a 0 

ifelse(((Test.2 >= Beginning) & (Test.2 <= End)) , 1, 0) 

####### This should (and does) return a 1 

### 
### Create New Variable On Previous Data Frame (Your.DF) named Time.Dummy 
### 
### Value for new variable will be 1 if time is between, value will be 0 if it is not. 
### 

Your.DF$Time.Dummy <- ifelse(((time.cet >= Beginning) & (time.cet <= End)) , 1, 0) 
1
library(lubridate) 

# Create fake data 
set.seed(2) 
dat = data.frame(time = seq(ymd_hms("2016-01-01 00:00:00"), ymd_hms("2016-01-31 00:00:00"), by="hour")) 
dat$price = 1 + cumsum(rnorm(nrow(dat), 0, 0.01)) 

# Create time dummy 
dat$dummy = ifelse(hour(dat$time) >=6 & hour(dat$time) <= 20, 1, 0) 
1

再現可能なコードに次の時間を含めるようにしてください。たとえば、time.numericが見つからないようです。

さて、私はいくつかのランダムな時間を補う必要がありました。

time.cet <- c(ymd_hms("2007-01-01 00:00:00"), 
       ymd_hms("2007-01-01 06:00:00"), 
       ymd_hms("2007-01-01 12:00:00")) 
time.cet 

[1] "2006-12-31 18:00:00 CST" "2007-01-01 00:00:00 CST" "2007-01-01 06:00:00 CST" 

解決策には重要ではないことに注意してください。

あなたはX時間がA & Bの間にあるかどうかをTRUE/FALSE(または1/0)のリストを取得するdplyr::betweenlubridate::hourを使用することができます。 betweenがあなたの入力は何>= & <=

関連する問題