2016-10-06 7 views
0

を組み合わせながら、次のサンプルdata.frame:メルト4列2つの変数の列

Date <- seq(as.Date("2016/9/1"), as.Date("2016/9/10"), "days") 
A <- sample(0:200, 10) 
B <- sample(0:400, 10) 
A_limit <- rep(200,10) 
B_limit <- rep(400,10) 
data_sample <- data.frame(Date,A,B,A_limit,B_limit) 

>  Date A B A_limit B_limit 
1 2016-09-01 175 270  200  400 
2 2016-09-02 160 50  200  400 
3 2016-09-03 173 25  200  400 
... 

と私は、フォームにそれを再構築したいと思います:

>  Date limit variable value 
1 2016-09-01 200  A 175 
2 2016-09-02 200  A 160 
3 2016-09-03 200  A 173 
... 
31 2016-09-01 400  B 270 
32 2016-09-02 400  B 50 
33 2016-09-03 400  B 25 
.... 

私が取得するために管理それが行われるが、私の方法は、はるかに複雑にあるように思える:

library("reshape2") 
data_sample_2 <- data_sample %>% melt(id=c("Date","A","B")) 

levels(data_sample_2$variable) <- c(levels(data_sample_2$variable),"A","B") 
data_sample_2$variable[data_sample_2$variable == "A_limit"] <- as.factor("A") 
data_sample_2$variable[data_sample_2$variable == "B_limit"] <- as.factor("B") 

names(data_sample_2)[names(data_sample_2) == "value"] <- "limit" 
names(data_sample_2)[names(data_sample_2) == "variable"] <- "variable_1" 

data_sample_3 <- data_sample_2 %>% melt(id=c("Date","variable_1","limit")) 
data_sample_3 <- droplevels(data_sample_3) 
data_sample_4 <- data_sample_3[data_sample_3$variable_1 == data_sample_3$variable,] 

data_sample_4$variable_1 <- NULL 

私はちょうどreshape2パッケージを使用して開始しましたですから、このdata.frameの変換を改善する方法については、私に教えてください。

+1

あなたは 'col1 <-c(" A_limit "、" B_limit "); col2 < - c( "A"、 "B") ';あなたが数値の 'variable' colを気にしないならば、' data.table :: melt(data_sample、measure = list(col1、col2)、 value.name = c( "limit"、 "value")) – mtoto

+0

私はあなたのコードを試してみるとこのエラーが出ます: 'エラー:データに値が見つからない:c(" A_limit "、" B_limit ")、c(" A "、" B ")'。どのような手がかりが間違っていますか? – RandomDude

+1

'data_sample'を' data.table'に変換してください – mtoto

答えて

1

あなたは(より多くので、それをどのように処理するかを確認するために、単純にすべてをINGのstackによりベースRを経由して、すなわち

df1 <- data.frame(Date = data_sample$Date, limit = stack(data_sample[-(1:3)])[[1]], 
        variable = stack(data_sample[2:3])[[2]], 
        value = stack(data_sample[2:3])[[1]], 
            stringsAsFactors = FALSE) 

head(df1) 
#  Date limit variable value 
#1 2016-09-01 200 A  67 
#2 2016-09-02 200 A  100 
#3 2016-09-03 200 A  166 
#4 2016-09-04 200 A  116 
#5 2016-09-05 200 A  89 
#6 2016-09-06 200 A  138 

tail(df1) 
#   Date limit variable value 
#15 2016-09-05 400 B  208 
#16 2016-09-06 400 B  387 
#17 2016-09-07 400 B  125 
#18 2016-09-08 400 B  116 
#19 2016-09-09 400 B  120 
#20 2016-09-10 400 B  241 
+0

私はその解決策が好きです!スタッキング中に列の名前を直接指定できる方法はありますか? – RandomDude

+0

@RandomDude updated – Sotos

+1

ベクトルを選択するときに二重 '[[...]]'が見つかりませんでした。素晴らしい答え多くの感謝! – RandomDude

1

これは何ですか?

data_sample_2 <- melt(data_sample,id.vars=c("Date","A_limit","B_limit")) 
data_sample_2$limit<- ifelse(data_sample_2$variable=="A",data_sample_2$A_limit,data_sample_2$B_limit) 
data_sample_2[,c("Date","limit","variable","value")] 
1

はあなたの例でreshape2を使用しているので、それはあなたが興味かもしれないが、これを行うことができます更新)tidyverseセットアップ。

私はあなたの生成コードを繰り返します:

Date <- seq(as.Date("2016/9/1"), as.Date("2016/9/10"), "days") 
A <- sample(0:200, 10) 
B <- sample(0:400, 10) 
A_limit <- rep(200,10) 
B_limit <- rep(400,10) 
data_sample <- data.frame(Date,A,B,A_limit,B_limit) 

# Preview 
head(data_sample) 
#>   Date A B A_limit B_limit 
#> 1 2016-09-01 39 53  200  400 
#> 2 2016-09-02 96 193  200  400 
#> 3 2016-09-03 143 75  200  400 
#> 4 2016-09-04 60 241  200  400 
#> 5 2016-09-05 126 225  200  400 
#> 6 2016-09-06 184 349  200  400 

は、今、私たちは「クリア」な方法でデータを操作する( reshape2が持っていることの責任の多くを取る) dplyrtidyrを使用することができます。

library(dplyr) 
library(tidyr) 

data_clean <- data_sample %>% 
    gather(variable, value, A, B) %>% 
    mutate(limit = if_else(variable == "A", A_limit, B_limit)) %>% 
    select(Date, limit, variable, value) 

# Inspect results 
head(data_clean) 
#>   Date limit variable value 
#> 1 2016-09-01 200  A 39 
#> 2 2016-09-02 200  A 96 
#> 3 2016-09-03 200  A 143 
#> 4 2016-09-04 200  A 60 
#> 5 2016-09-05 200  A 126 
#> 6 2016-09-06 200  A 184