2011-05-17 65 views
2

嗨我想第一次使用重塑功能。我有一個包含大量信息和每日降雨量的數據框。我試圖把它放在一個很長的格式中,這樣我就可以每日降雨一行。然而,當我使用重塑功能我降雨轉化爲文字......這是一個有點我的數據(實際上那張一路P31,P是每天的降雨量)R重塑功能正在將整數轉換爲字符

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" 

有誰告訴我爲什麼?此外,爲什麼在「日」之前會有一列新生評分?

乾杯

+3

檢查str(CET)以查看是否所有P1..P31變量都是整數。他們很可能不是。 NA列也告訴我你的初始數據有問題,但是你沒有給出,我們無法確定。 – 2011-05-17 16:07:08

+0

謝謝!!!事實上,並非所有的變量都是整數,現在我修復了我的原始數據工作正常! – sbg 2011-05-17 17:03:53

回答

0

您可能已經回答了您自己的問題。有可能在最初閱讀表格時,P1列是一個因素,然後可能轉換爲字符。在你最初調用read.table的時候,你可以使用stringsAsFactors = FALSE來確保你認爲是數字的東西。

吉姆

+1

沒有。 (CET $ P1)會給「因素」,而不是「整數」 – 2011-05-17 16:04:30

+0

我試了一下,它並沒有幫助... – sbg 2011-05-17 16:10:21

2

我發現在基礎R的reshape功能很難使用。它是爲面板數據設計的,因此對於大多數一般情況來說,參數很難解釋。 (你的數據是面板數據格式,所以你很幸運。)

相反,我建議在包reshape2中使用函數meltcastmelt用於將數據幀從寬到高格式重新整形,並且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

謝謝你回答這個問題,並節省我的煩惱與它... – 2011-05-17 18:01:03

0

嘗試在您致電read.table時通過header=TRUE。看起來第一行被包含在數據中,然後將其作爲因子。或者通過skip=1完全丟棄第一行。

+0

class( CET $ P1)永遠不會返回「整數」,如果這是真的...... – 2011-05-17 17:10:39