2015-09-07 3 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. использование 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), ] 

Melt & Cast

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> 
Смежные вопросы