Комплексное преобразование данных

Мне нужно преобразовать следующий (упрощенный) набор данных, созданный с помощью следующего кода:

structure(list(W1.1 = structure(c(1L, NA, NA), .Names = c("case1", 
"case2", "case3"), .Label = "1", class = "factor"), R1.1 = structure(c(1L, 
NA, NA), .Names = c("case1", "case2", "case3"), .Label = "2", class = "factor"), 
    W1.2 = structure(c(NA, 1L, NA), .Names = c("case1", "case2", 
    "case3"), .Label = "1", class = "factor"), R1.2 = structure(c(NA, 
    1L, NA), .Names = c("case1", "case2", "case3"), .Label = "1", class = "factor"), 
    W2.1 = structure(c(NA, 1L, NA), .Names = c("case1", "case2", 
    "case3"), .Label = "1", class = "factor"), R2.1 = structure(c(NA, 
    1L, NA), .Names = c("case1", "case2", "case3"), .Label = "1", class = "factor"), 
    W2.2 = structure(c(1L, NA, NA), .Names = c("case1", "case2", 
    "case3"), .Label = "2", class = "factor"), R2.2 = structure(c(1L, 
    NA, NA), .Names = c("case1", "case2", "case3"), .Label = "1", class = "factor"), 
    W3.1 = structure(c(1L, NA, NA), .Names = c("case1", "case2", 
    "case3"), .Label = "1", class = "factor"), R3.1 = structure(c(1L, 
    NA, NA), .Names = c("case1", "case2", "case3"), .Label = "1", class = "factor"), 
    W3.2 = structure(c(1L, 1L, NA), .Names = c("case1", "case2", 
    "case3"), .Label = "1", class = "factor"), R3.2 = structure(c(1L, 
    1L, NA), .Names = c("case1", "case2", "case3"), .Label = "1", class = "factor"), 
    age = structure(c(3L, 1L, 2L), .Names = c("case1", "case2", 
    "case3"), .Label = c("20", "48", "56"), class = "factor"), 
    gender = structure(c(2L, 1L, 2L), .Names = c("case1", "case2", 
    "case3"), .Label = c("female", "male"), class = "factor")), .Names = c("W1.1", 
"R1.1", "W1.2", "R1.2", "W2.1", "R2.1", "W2.2", "R2.2", "W3.1", 
"R3.1", "W3.2", "R3.2", "age", "gender"), row.names = c(NA, 3L
), class = "data.frame")

Для новых данных я хочу: - строку, посвященную каждому x.x, с информацией о значении Rx.x, возрасте и поле. - строка возвращается только тогда, когда Wx.x равно 1. Когда 2 или NA, мне это не нужно.

Для моего примера этот набор данных должен выглядеть примерно так:

  incident type Where Reported age gender
1        1  1.1     1        2  56   male
2        2  3.1     1        1  56   male
3        3  3.2     1        1  56   male
4        4  1.2     1        1  20 female
5        5  2.1     1        1  20 female
6        6  3.2     1        1  20 female

Примечание: столбец «Где» можно даже опустить, так как он должен быть постоянным вектором, равным 1, а мне он не нужен для анализа.


person SarahDew    schedule 28.12.2012    source источник
comment
Формат dput, который вы использовали, предпочтительнее, особенно для входных данных. Для выходных данных вы можете просто вырезать и вставить вывод консоли в фрагмент кода (как я сделал выше). Если вам это нравится, я думаю, что было бы нормально вернуться и отредактировать свой вопрос, чтобы для краткости удалить версию dput() выходных данных ...   -  person Ben Bolker    schedule 28.12.2012
comment
Спасибо, так лучше выглядит!   -  person SarahDew    schedule 28.12.2012
comment
кстати, хороший первый вопрос.   -  person Ben Bolker    schedule 28.12.2012


Ответы (1)


Это (в основном) проблема, которую должен решить reshape(). Предполагая, что ваш исходный набор данных называется «temp»:

Во-первых, измените его из широкого формата в длинный формат.

temp.long <- reshape(temp, direction = "long",
                     idvar=c("age", "gender"), 
                     varying = which(!names(temp) %in% c("age", "gender")), 
                     sep = "")
temp.long
#               age gender time    W    R
# 56.male.1.1    56   male  1.1    1    2
# 20.female.1.1  20 female  1.1 <NA> <NA>
# 48.male.1.1    48   male  1.1 <NA> <NA>
# 56.male.1.2    56   male  1.2 <NA> <NA>
# 20.female.1.2  20 female  1.2    1    1
# 48.male.1.2    48   male  1.2 <NA> <NA>
# 56.male.2.1    56   male  2.1 <NA> <NA>
# 20.female.2.1  20 female  2.1    1    1
# 48.male.2.1    48   male  2.1 <NA> <NA>
# 56.male.2.2    56   male  2.2    2    1
# 20.female.2.2  20 female  2.2 <NA> <NA>
# 48.male.2.2    48   male  2.2 <NA> <NA>
# 56.male.3.1    56   male  3.1    1    1
# 20.female.3.1  20 female  3.1 <NA> <NA>
# 48.male.3.1    48   male  3.1 <NA> <NA>
# 56.male.3.2    56   male  3.2    1    1
# 20.female.3.2  20 female  3.2    1    1
# 48.male.3.2    48   male  3.2 <NA> <NA>

Во-вторых, сделать уборку.

temp.long <- na.omit(temp.long)
temp.long <- temp.long[-which(temp.long$W == 2), ]
temp.long <- temp.long[order(rev(temp.long$gender), temp.long$time), ]
rownames(temp.long) <- NULL
temp.long$incident <- seq(nrow(temp.long))
temp.long
#   age gender time W R incident
# 1  56   male  1.1 1 2        1
# 2  56   male  3.1 1 1        2
# 3  56   male  3.2 1 1        3
# 4  20 female  1.2 1 1        4
# 5  20 female  2.1 1 1        5
# 6  20 female  3.2 1 1        6

Вы можете выполнить дополнительную очистку, чтобы изменить имена столбцов и порядок столбцов, если это важно.

person A5C1D2H2I1M1N2O1R2T1    schedule 28.12.2012
comment
Привет, спасибо за этот ответ! Я уверен, что эта функция - то, что я ищу. Единственная проблема в том, что я думал, что смогу понять логику, а затем применить ее к моему реальному набору данных. Но я не могу понять это. Я думаю, проблема в том, что sep= не применяется к именам реальных переменных. Это: - person SarahDew; 29.12.2012
comment
nr nis ГдеTV1 ГдеTV2 ГдеTV3 ГдеTV4 ГдеTV5 FysAbu ГдеFA1 ГдеFA2 ГдеFA3 ГдеFA4 ГдеFA5 УгрозаFysAbu ГдеTFA1 ГдеTFA2 ГдеTFA3 ГдеTFA4 ГдеTFA5 пол диплом национальность RepTV1 RepTV2 RepTV3 RepTV4 RepTV5 RepFA1 RepFA2 RepFA3 RepFA4 RepFA5 RepTFA1 RepTFA1 RepTFA2 Rep4ATTFA3 - person SarahDew; 29.12.2012
comment
Я перекодировал в эти переменные: [1] ID nr nis пол диплом [6] национальность age age_cat W.TV1 W.TV2 [11] W.TV3 W.TV4 W.TV5 W.FA1 W.FA2 [16] W.FA3 W.FA4 W.FA5 W.TFA1 W.TFA2 [21] W.TFA3 W.TFA4 W.TFA5 R.TV1 R.TV2 [26] R.TV3 R.TV4 R.TV5 R.FA1 R.FA2 [31 ] R.FA3 R.FA4 R.FA5 R.TFA1 R.TFA2 [36] R.TFA3 R.TFA4 R.TFA5 - person SarahDew; 29.12.2012
comment
И применил эту функцию: subset.long ‹- reshape(subset,direction=long,idvar=c(Age,Age_cat, пол, диплом,национальность,newID,nr,nis),variing=what(!names(subset) %in % c(Возраст,Age_cat,пол,диплом,национальность,newID,nr,nis)),sep==.) Но это не сработало. Есть идеи, почему? - person SarahDew; 29.12.2012
comment
Кажется, сработало с этим: subset.long ‹- reshape(subset,direction=long,variing=9:38,sep=.) Нужно проверить, получил ли я все данные, но, похоже, проблема решена. Большое спасибо, что поставили меня на путь! - person SarahDew; 29.12.2012
comment
@Marlo, рад слышать, что в конечном итоге это сработало. Функция reshape — одна из самых сложных функций, особенно из-за документации; но как только вы поняли это, это действительно полезная функция. Я использую which(!names(temp... просто для того, чтобы избежать необходимости ссылаться на столбцы по их индексу и сказать, что нужно получить все, что не является переменной ID, но это может быть не так для ваших реальных данных. - person A5C1D2H2I1M1N2O1R2T1; 29.12.2012
comment
Да, я какое-то время задавался вопросом 'what(!names(temp...'). Рад, что теперь знаю, что это делает. Я проверил данные, и они верны! - person SarahDew; 29.12.2012