2

嗨,我第一次尝试使用重塑功能。我有一个包含大量信息和每日降雨量的数据框。我试图把它放在一个长格式,这样我每天的降雨量就会有一行。然而,当我使用 reshape 函数时,我的降雨量被转化为字符......这是我的一些数据(它实际上一直到 P31,P 是每天的降雨量)

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"

谁能告诉我为什么??另外为什么在“day”之前有一列NA?

干杯

4

3 回答 3

2

我发现reshapebase 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包并使用melt. (注意使用paste来轻松引用所有测量变量,而不是手工制作一长串。)

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

您可能已经回答了自己的问题。最初阅读表格时,P1 列可能是一个因素,然后可能转换为字符。在您对 read.table 的初始调用中,您可以执行 stringsAsFactors = FALSE 以确保您认为是数字的东西是。

吉姆

于 2011-05-17T15:57:33.590 回答
0

尝试将header=TRUE您的呼叫传递给read.table. 看起来第一行包含在数据中,然后将其转换为因子。或者通过skip=1完全丢弃第一行。

于 2011-05-17T17:03:42.603 回答