Повторно используйте режущую колонку с регулярным выражением colsplit со смесью и изменением формы пакета. - PullRequest
2 голосов
/ 06 марта 2012

У меня проблема с преобразованием классических входных данных с изменением формы

Мои входные данные:

   df <- read.table(textConnection(" Ville POP1999 POP2010 PARC1999 PARC2010
    1 Paris 1800000 2200000 150 253
    2 Itxassou 1000 1800 0 NA
    "))

с результатом в этих data.frame:

     Ville   POP1999 POP2010 PARC1999 PARC2010
1    Paris 1800000 2200000    150      253
2 Itxassou    1000    1800      0       NA

У меня есть такой тип ввода, и я хочу использовать colsplit (пакет reshape2) с регулярным выражением, чтобы вырезать мой фрейм данных так:

     Ville    Date    Population Parc 
1    Paris    1999    1800000    150
2    Paris    2010    2200000    253
3    Itxassou 1999    1000       0
4    Itxassou 2010    1800       NA

Как вы думаете, возможно ли сделать это в одну строку с изменением формы 1 или 2 и функцией colsplit?

Мой идентификатор равен "Ville" + "Date", поэтому я думаю, что сначала трудно срезать с помощью colsplit, а после этого повторно использовать идентификатор результата colum с meld: /

У вас есть идея ответа?

Обновление 1:

Я добавляю некоторые трудности к этой проблеме, представьте, что теперь у нас есть тысячи столбцов, и столбцы смешаны. Я пытаюсь использовать grep и изменить форму, но в настоящее время ничего не получается .. (см. Комментарии к @kohske отличный ответ)

Обновление 2:

@ kohske решит проблему с добавлением этого кода:

cn <- grep("*[0-9]",names(df),value="TRUE")
reshape(df, varying =  cn, direction = "long", sep = "")

Ответы [ 2 ]

3 голосов
/ 06 марта 2012

вы можете использовать stats::reshape:

> reshape(df, 2:5, direction = "long", sep = "")
          Ville time     POP PARC id
1.1999    Paris 1999 1800000  150  1
2.1999 Itxassou 1999    1000    0  2
1.2010    Paris 2010 2200000  253  1
2.2010 Itxassou 2010    1800   NA  2
2 голосов
/ 25 июля 2013

Вот чистое решение reshape2:

library("reshape2")
library("stringr")

df2 <- melt(df, id.var=c("Ville"))
df2 <- cbind(df2, 
             colsplit(df2$variable, pattern=perl("(?=\\d)"), c("var", "Date")))
dcast(df2, Ville + Date ~ var)

Сложная часть - это регулярное выражение (Perl), которое представляет собой загадку для цифры.variable (который был заголовком столбца) разделяется перед первой цифрой.Результаты этого:

     Ville Date PARC     POP
1 Itxassou 1999    0    1000
2 Itxassou 2010   NA    1800
3    Paris 1999  150 1800000
4    Paris 2010  253 2200000

Вы можете переименовать столбцы PARC и POP;эти имена взяты из оригинальных имен столбцов.

...