2

こんにちは、初めて reshape 関数を使用しようとしています。多くの情報と毎日の降雨量を含む data.frame があります。1 日あたりの降雨量が 1 行になるように、長い形式で表示しようとしています。ただし、reshape 関数を使用すると、降雨量が文字に変換されます... これが私のデータの一部です (実際には P31 まで続きます。P は 1 日あたりの降水量です)。

code year month station ALTITUD NOM_PROV LONGITUD LATITUD P1 P2  P3  P4    
2011 1932     7 EMBALSE CUERDA DEL POZO    1150    SORIA   242172  415235  0  0   0  54   
2011 1932     8 EMBALSE CUERDA DEL POZO    1150    SORIA   242172  415235  0  0   0   0   

私のコードは次のとおりです。

CET <- read.table("H:/METEO_data/AEMET_2/2011.csv", sep=",", header=F)

colnames(CET)<-c("code","year","month","station","ALTITUD","NOM_PROV","LONGITUD","LATITUD","P1","P2","P3","P4","P5","P6","P7","P8","P9","P10","P11","P12","P13","P14","P15","P16","P17","P18","P19","P20","P21","P22","P23","P24","P25","P26","P27","P28","P29","P30","P31")

aa<- reshape(CET, timevar="day", varying = list(c("P1","P2","P3","P4","P5","P6","P7","P8","P9","P10","P11","P12","P13","P14",
"P15","P16","P17","P18","P19","P20","P21","P22","P23","P24","P25","P26","P27","P28","P29","P30","P31")),direction="long")   

最終結果は、私が望んでいた形のデータです:

   code year month                 station ALTITUD NOM_PROV LONGITUD LATITUD NA day P1 id  
1.1 2011 1932     7 EMBALSE CUERDA DEL POZO    1150    SORIA   242172  415235 NA   1  0  1  
2.1 2011 1932     8 EMBALSE CUERDA DEL POZO    1150    SORIA   242172  415235 NA   1  0  2  
3.1 2011 1932     9 EMBALSE CUERDA DEL POZO    1150    SORIA   242172  415235 NA   1  0  3  
4.1 2011 1932    10 EMBALSE CUERDA DEL POZO    1150    SORIA   242172  415235 NA   1  0  4  

しかし、次の理由で使用できません。

class(aa$P1)  
[1] "character"  

元の data.frame の場合:

class(CET$P1)  
[1] "integer"

誰か教えてくれませんか?? また、「日」の前にNAの列があるのはなぜですか?

乾杯

4

3 に答える 3

2

reshapeベース R の関数は非常に使いにくいと思います。これはパネル データ用に設計されているため、ほとんどの一般的なケースでパラメーターを解釈するのは困難です。(あなたのデータはパネルデータ形式なので、あなたはラッキーです。)

代わりに、関数meltcastin packageを使用することをお勧めしますreshape2meltは、データ フレームをワイド フォーマットからトール フォーマットに再形成するために使用され、castその逆、つまりトール フォーマットからワイド フォーマットに再形成します。提供されたデータのスニペットを使用した例を次に示します。

まず、データを再作成します。

x <- "code year month station ALTITUD NOM_PROV LONGITUD LATITUD P1 P2  P3  P4    
2011 1932     7 'EMBALSE CUERDA DEL POZO'    1150    SORIA   242172  415235  0  0   0  54   
2011 1932     8 'EMBALSE CUERDA DEL POZO'    1150    SORIA   242172  415235  0  0   0   0"

CET <- read.table(textConnection(x), header=TRUE, quote="'")

reshape2パッケージをロードして使用しますmeltpaste(手動で長いリストを作成するのではなく、すべての測定変数を簡単に参照するために を使用することに注意してください。)

library(reshape2)
mCET <- melt(CET, measure.vars=paste("P", 1:4, sep=""), 
  variable_name="day", value_name="rainfall")

結果:

mCET

  code year month                 station ALTITUD NOM_PROV LONGITUD LATITUD day value
1 2011 1932     7 EMBALSE CUERDA DEL POZO    1150    SORIA   242172  415235  P1     0
2 2011 1932     8 EMBALSE CUERDA DEL POZO    1150    SORIA   242172  415235  P1     0
3 2011 1932     7 EMBALSE CUERDA DEL POZO    1150    SORIA   242172  415235  P2     0
4 2011 1932     8 EMBALSE CUERDA DEL POZO    1150    SORIA   242172  415235  P2     0
5 2011 1932     7 EMBALSE CUERDA DEL POZO    1150    SORIA   242172  415235  P3     0
6 2011 1932     8 EMBALSE CUERDA DEL POZO    1150    SORIA   242172  415235  P3     0
7 2011 1932     7 EMBALSE CUERDA DEL POZO    1150    SORIA   242172  415235  P4    54
8 2011 1932     8 EMBALSE CUERDA DEL POZO    1150    SORIA   242172  415235  P4     0



str(mCET)

'data.frame': 8 obs. of  10 variables:
    $ code    : int  2011 2011 2011 2011 2011 2011 2011 2011
$ year    : int  1932 1932 1932 1932 1932 1932 1932 1932
$ month   : int  7 8 7 8 7 8 7 8
$ station : Factor w/ 1 level "EMBALSE CUERDA DEL POZO": 1 1 1 1 1 1 1 1
$ ALTITUD : int  1150 1150 1150 1150 1150 1150 1150 1150
$ NOM_PROV: Factor w/ 1 level "SORIA": 1 1 1 1 1 1 1 1
$ LONGITUD: int  242172 242172 242172 242172 242172 242172 242172 242172
$ LATITUD : int  415235 415235 415235 415235 415235 415235 415235 415235
$ day     : Factor w/ 4 levels "P1","P2","P3",..: 1 1 2 2 3 3 4 4
$ value   : int  0 0 0 0 0 0 54 0

PS。@Joris Mey は、元のデータに根本的な問題がある可能性があることを示唆しています。この場合、 を使用する前または後に、これを修正する必要がある場合がありますmelt

于 2011-05-17T16:26:47.463 に答える
0

header=TRUEに電話をかけてみてくださいread.table。最初の行がデータに含まれているように見えます。データはその後、因子としてキャストされます。または、パスskip=1して最初の行を完全に破棄します。

于 2011-05-17T17:03:42.603 に答える
0

あなた自身の質問に答えたかもしれません。最初に P1 列のテーブルを読み取ると、要素である可能性があり、その後文字に変換される可能性があります。read.table への最初の呼び出しで、stringAsFactors = FALSE を実行して、数値であると思われるものを確実に数値にすることができます。

ジム

于 2011-05-17T15:57:33.590 に答える