R Reshape函数将整数转换为字符

时间:2011-05-17 15:50:07

标签: class r reshape

您好我是第一次尝试使用重塑功能。我有一个data.frame有很多信息和每日降雨量。我试图把它放在一个很长的格式,这样我每天每天会有一排降雨。然而,当我使用重塑功能时,我的降雨变成了人物......这里有一些我的数据(它实际上一直到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"

有人可以告诉我为什么吗?另外为什么在“白天”之前会有一列NA?

干杯

3 个答案:

答案 0 :(得分:2)

我发现基础R中的reshape函数非常难以使用。它是为面板数据设计的,因此对于大多数一般情况,参数很难解释。 (您的数据采用面板数据格式,所以很幸运。)

相反,我建议您使用包melt中的castreshape2功能。 melt用于将数据帧从宽格式转换为高格式,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之前或之后解决此问题。

答案 1 :(得分:0)

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

吉姆

答案 2 :(得分:0)

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