2

形状変更を使用して従来の入力データを変換するのに問題があります

私の入力データ:

   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とコルスプリット機能でこれを一列に並べることは可能だと思いますか?

私のIDは"Ville"+ "Date"に等しいので、最初にcolsplitでカットするのは難しいと思います。その後、結果のidcolumをmeldで再利用します:/

あなたは答えのアイデアを持っていますか?

アップデート1:

この問題にいくつかの難しさを追加します。今では数千のカラムがあり、カラムが混在していると想像してください。grepを使用して形状を変更しようとしましたが、現時点では結果がありません。(@kohskeのすばらしい回答に関するコメントを参照してください)

アップデート2:

@kohskeは、このコードを追加することで問題を解決します。

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

2 に答える 2

3

あなたが使用することができます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
于 2012-03-06T17:15:13.483 に答える
2

これが純粋な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これらの名前は、元の列名に由来します。

于 2013-07-25T16:28:50.273 に答える