您好我是第一次尝试使用重塑功能。我有一个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?
干杯
答案 0 :(得分:2)
我发现基础R中的reshape
函数非常难以使用。它是为面板数据设计的,因此对于大多数一般情况,参数很难解释。 (您的数据采用面板数据格式,所以很幸运。)
相反,我建议您使用包melt
中的cast
和reshape2
功能。 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
完全丢弃第一行。