2016-09-28 3 views
0

Так мои данные импортируются из Excel в этом форматеПреобразование нескольких заголовков столбцов значений в R

   alpha 
     beta   gamma 
    var1 var2 var3 var1 var2 var3 
1  21 50 5 22 48 6   
2  27 50 5 24 48 6   
3  26 50 5 28 48 6  
4  25 50 5 28 48 6 

и я хочу, чтобы преобразовать его в этот формат

var1 var2 var3 var4 var5 
1  21 50 5 alpha beta    
2  27 50 5 alpha beta    
3  26 50 5 alpha beta  
4  25 50 5 alpha beta 
5  22 48 6 alpha gamma 
6  24 48 6 alpha gamma 
7  28 48 6 alpha gamma 
8  28 48 6 alpha gamma 

Что может быть возможным способом сделать это в R. Обратите внимание, что альфа - это заголовок первого уровня, бета и гамма - это заголовки второго уровня, но импортированные в виде строки в R

Вот источник (0)

structure(list(X.group.age = structure(c(1L, 1L, 2L, 
3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L), .Label = c("", "19-15", 
"24-20", "29-25", "34-30", "39-35", "44-40", "49-45", "54-50", 
"59-55", "64-60"), class = "factor"), X1999. = structure(c(12L, 
11L, 4L, 3L, 8L, 7L, 6L, 5L, 2L, 1L, 10L, 9L), .Label = c("132486", 
"187238", "226157", "25755", "277822", "351166", "408307", "435447", 
"53084", "84800", "MALE", "BRITISH"), class = "factor"), 
    X. = structure(c(1L, 12L, 6L, 10L, 2L, 11L, 9L, 5L, 3L, 7L, 
    8L, 4L), .Label = c("", "102978", "11871", "1828", "24871", 
    "3720", "4136", "4526", "49072", "65049", "78375", "إناث" 
    ), class = "factor"), X..1 = structure(c(1L, 3L, 2L, 2L, 
    2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("", "NA", "TOTAL" 
    ), class = "factor"), X..2 = structure(c(12L, 11L, 9L, 2L, 
    7L, 8L, 6L, 4L, 1L, 10L, 5L, 3L), .Label = c("171302", "204856", 
    "20740", "318726", "40116", "493643", "576850", "612027", 
    "8415", "93130", "MALE", "USA"), class = "factor"), 
    X..3 = structure(c(1L, 12L, 8L, 6L, 10L, 2L, 11L, 7L, 3L, 
    9L, 4L, 5L), .Label = c("", "158711", "18484", "2038", "2410", 
    "37816", "43444", "5089", "7134", "78785", "90155", "FEMALE" 
    ), class = "factor"), X..4 = structure(c(1L, 12L, 3L, 6L, 
    10L, 11L, 9L, 7L, 4L, 2L, 8L, 5L), .Label = c("", "100264", 
    "13504", "189786", "23150", "242672", "362170", "42154", 
    "583798", "655635", "770738", "TOTAL"), class = "factor"), 
    X2000. = structure(c(12L, 11L, 6L, 3L, 8L, 7L, 5L, 4L, 2L, 
    1L, 10L, 9L), .Label = c("132830", "201634", "225389", "289188", 
    "364795", "38815", "419225", "443670", "59708", "97645", 
    "MALE", "BRITISH"), class = "factor"), X..5 = structure(c(1L, 
    12L, 6L, 9L, 2L, 11L, 8L, 5L, 3L, 10L, 7L, 4L), .Label = c("", 
    "103289", "14099", "2033", "27027", "3327", "4341", "49512", 
    "52910", "6867", "85007", "FEMALE"), class = "factor"), 
    X..6 = structure(c(1L, 3L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
    2L, 2L), .Label = c("", "NA", "TOTAL"), class = "factor"), 
    X..7 = structure(c(12L, 11L, 3L, 1L, 4L, 6L, 9L, 7L, 5L, 
    2L, 10L, 8L), .Label = c("115574", "177250", "19787", "267819", 
    "326709", "465506", "494696", "51245", "544286", "92696", 
    "male", "USA"), class = "factor"), X..8 = structure(c(1L, 
    12L, 8L, 5L, 7L, 2L, 11L, 10L, 6L, 9L, 4L, 3L), .Label = c("", 
    "106279", "1476", "3050", "32104", "36447", "52824", "6407", 
    "7497", "75029", "96487", "female"), class = "factor"), 
    X..9 = structure(c(1L, 3L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
    2L, 2L), .Label = c("", "NA", "Total"), class = "factor")), .Names = c("X.group.age", 
"X1999.", "X.", "X..1", "X..2", "X..3", "X..4", "X2000.", "X..5", 
"X..6", "X..7", "X..8", "X..9"), row.names = c(NA, -12L), class = "data.frame") 
+1

Вы можете разместить 'dput (yourexample)' так, чтобы знать структуру данных? Или вы прочитали данные в R? – akrun

+0

Да, размещено выше –

+0

Возможно, лучше прочитать набор данных, пропустив первые две строки, т. Е. 'Dat <- read.csv (" yourfile.csv ", skip = 2, stringsAsFactors = FALSE)', чтобы избежать преобразования всех столбцов в 'фактор/character'. Затем прочитайте 1-ю две строки – akrun

ответ

0

Когда вы исправили заголовок в Excel, вы можете сделать следующее, чтобы изменить ваши данные. (пример со случайными данными).

library(reshape2) 

dt <- data.frame(id = 1:100 
       ,beta_var1 = rnorm(100,mean = 4, sd = 2) 
       , beta_var2 = rnorm(100,mean = 7, sd = 3) 
       , gamma_var1 = rnorm(100,mean = 5, sd = 2) 
       , gamma_var2 = rnorm(100,mean = 5, sd = 3)) 
head(dt) 

st1 <- melt(dt, id.vars = 'id') 
head(st1) 

st2 <- transform(st1, n = colsplit(st1$variable,"_", c("letter","var"))) 
head(st2) 

st3 <- dcast(st2, id + n.letter ~ n.var) 
head(st3) 

источник

> head(dt) 
id beta_var1 beta_var2 gamma_var1 gamma_var2 
1 1 0.09267697 8.756578 2.350164 7.774297 
2 2 0.97311566 8.097634 9.793237 2.261395 
3 3 2.08363376 7.566973 7.053660 3.725915 
4 4 2.97215984 10.934154 4.767223 5.779393 
5 5 2.21449327 11.794902 6.016574 5.998344 
6 6 3.81294082 8.373939 5.257709 2.481696 

выход

> head(st3) 
id n.letter  var1  var2 
1 1  beta 0.09267697 8.756578 
2 1 gamma 2.35016370 7.774297 
3 2  beta 0.97311566 8.097634 
4 2 gamma 9.79323667 2.261395 
5 3  beta 2.08363376 7.566973 
6 3 gamma 7.05365982 3.725915 
Смежные вопросы