2015-10-09 28 views
0

我需要改變一個數據幀是具有按日期排列像這樣的變量:如何通過最新編譯的數據合併到一列

type Var_Day1 Var_Day2 Var_Day3 
1 2 66 222 
2 5 55 333 
3 6 44 555 
4 3 33 444 
5 4 22 333 

與對於所有天數的變量一列新的數據幀。這樣的事情:

type Day Var 
1 1 2 
2 1 5 
3 1 6 
4 1 3 
5 1 4 
1 2 66 
2 2 55 
3 2 44 
4 2 33 
5 2 22 
1 3 222 
2 3 333 
3 3 555 
4 3 444 
5 3 333 

我試過包重塑和功能融化,但我卡住了。這裏是我的代碼:

install.packages("reshape") 
library ("reshape") 
data<-read.csv("data by day.csv",header=T) 
newdata <- melt(data, id=c("type")) 

任何建議? 非常感謝, 迭戈

回答

0

使用dplyrtidyr。首先我們將gather的數據(與熔化相同)與類型作爲id變量(由-type指定)。然後我們使用extract_numeric獲得列標題中的數字部分:

library(dplyr) 
library(tidyr) 
data %>% gather(day, Var, -type) %>% 
     mutate(day = extract_numeric(day)) 
    type day Var 
1  1 1 2 
2  2 1 5 
3  3 1 6 
4  4 1 3 
5  5 1 4 
6  1 2 66 
7  2 2 55 
8  3 2 44 
9  4 2 33 
10 5 2 22 
11 1 3 222 
12 2 3 333 
13 3 3 555 
14 4 3 444 
15 5 3 333 
+0

謝謝jeremycg。出於某種原因tidyr似乎不工作。 – Cba

+0

嘗試運行'install.packages(「tidyr」)'和install.packages(「dplyr」) – jeremycg

+0

謝謝。它很棒!我嘗試閱讀有關mutate,但我不明白它做了什麼。你能解釋爲什麼它是「extract_numeric(day)」而不是「extract_numeric(var_day)」? – Cba

0

事情是這樣的:

library(reshape2) 
data("LifeCycleSavings") 
LifeCycleSavings$type <- 1:50 
colnames(LifeCycleSavings)[1:5] <- paste0("var_day", 1:5) 
melt(LifeCycleSavings, id.vars = "type") -> z 
as.character(z$variable) -> z$variable 
gsub("var_day", "", z$variable) -> z$day 
z[,c("type", "day", "value")] -> z 
colnames(z)[3] <- "var 
+0

謝謝,Chris。我不太瞭解gsub的一部分。如果不是「價值」,我想將其命名爲「var」? – Cba

+0

我編輯了答案,將其命名爲var ... gsub基本上是從Var_Day1,Var_Day2,Var_Day2等中剝離「Var_Day」。 – Chris

相關問題