2015-09-07 46 views
0

我在寬格式的數據集,看起來像這樣:如何將具有兩種標題的數據集轉換爲長格式?

header 1  x x x y y z z 
header 2  1 2 3 1 2 1 2 
2015   3.0 4.0 2.0 3.1 2.1 2.3 2.1 
2016   2.0 4.4 1.0 2.1 3.1 5.3 0.1 
... 

我想將其更改爲長格式,看起來像這樣:

header 1  variable 1 2 3 
2015   x  3.0 4.0 2.0 
2015   y  3.1 2.1 N/A 
2015   Z  2.3 2.1 N/A 
2016   ... 

這是我的方法:

  1. 級聯標題1和標題2用分隔符
  2. 使用melt()函數和
  3. 拆分兩個

但是,這是行不通的melt功能改變了我的字符因素,然後我不能分割。任何人都可以幫助或建議更好的方法嗎?

+1

你可以做一個可重現的例子,幷包括代碼和所需的輸出? –

+0

你可以將你的因子變量as.character變回字符。這對tidyr來說也是可行的,但是你的帖子中沒有代碼可以使用。 – hrbrmstr

回答

0

數據

d <- read.table(header = FALSE, stringsAsFactors = FALSE, 
       text = "header1  x x x y y z z 
header2  1 2 3 1 2 1 2 
2015   3.0 4.0 2.0 3.1 2.1 2.3 2.1 
2016   2.0 4.4 1.0 2.1 3.1 5.3 0.1") 

級聯前兩行

names(d)[-1] <- paste(d[1, -1], d[2, -1], sep = ".") 
d.new <- d[-(1:2), ] 

熔體&角色

d.m <- melt(d.new, "V1", variable_name = "var") 
cast(cbind(d.m, colsplit(d.m$var, split = "\\.", names = c("variable", 
    "number"))), V1 + variable ~ number) 

#  V1 variable 1 2 3 
# 1 2015  x 3.0 4.0 2.0 
# 2 2015  y 3.1 2.1 <NA> 
# 3 2015  z 2.3 2.1 <NA> 
# 4 2016  x 2.0 4.4 1.0 
# 5 2016  y 2.1 3.1 <NA> 
# 6 2016  z 5.3 0.1 <NA> 
0

或與hadleyverse:

read.table(text="header_1  x x x y y z z 
header_2  1 2 3 1 2 1 2 
2015   3.0 4.0 2.0 3.1 2.1 2.3 2.1 
2016   2.0 4.4 1.0 2.1 3.1 5.3 0.1", 
      header=FALSE, stringsAsFactors=FALSE) -> dat 

# deal with "headers" 
colnames(dat) <- c("year", sprintf("%s %s", dat[1,], dat[2,])[-1]) 

# reshape the data 
gather(dat[-(1:2),], variable, value, -year) %>% 
    separate(variable, c("variable", "i")) %>% 
    spread(i, value) 

## year variable 1 2 3 
## 1 2015  x 3.0 4.0 2.0 
## 2 2015  y 3.1 2.1 <NA> 
## 3 2015  z 2.3 2.1 <NA> 
## 4 2016  x 2.0 4.4 1.0 
## 5 2016  y 2.1 3.1 <NA> 
## 6 2016  z 5.3 0.1 <NA> 
相關問題