2013-07-13 81 views
2

我已經從NOAA下載了一年的數據。問題是下載的數據中也有文本。所以,我找到了數據線的模式並將其提取出來。我使用的代碼如下:將單行轉換爲R中的多列

url <- "http://tidesandcurrents.noaa.gov/data_menu.shtml?bdate=20080101&edate=20081231&wl_sensor_hist=W2&relative=&datum=6&unit=0&shift=s&stn=8737048+Mobile+State+Docks%2C+AL&type=Historic+Tide+Data&format=View+Data" 
download.file(url,destfile="data/mobile-docks-2008.dat") 

mob2008 <- readLines("data/mobile-docks-2008.dat") 
head(mob2008) 

# Find pattern to separate data 
pat <- grep(pattern="([0-9]+)\\s[0-9]",mob2008) 

jd1 <- data.frame(mob2008[pat]) 
head(jd1) 
> head(jd1) 
          mob2008.pat. 
1 8737048 20080101 00:00 0.125 0.270 
2 8737048 20080101 01:00 0.090 0.220 
3 8737048 20080101 02:00 0.070 0.167 
4 8737048 20080101 03:00 0.061 0.093 
5 8737048 20080101 04:00 0.057 0.002 
6 8737048 20080101 05:00 0.052 -0.108 

如何將單行更改爲R中的多列?似乎是一個微不足道的問題,但我堅持這一點。

問題是數據幀jd1只有一列。我需要每行有5列。

+0

'data'是我的工作目錄的文件夾。您只需要替換數據 –

+1

如果您定期從網頁上抓取數據,則可能需要查看「XML」包。它有一個函數'htmlTreeParse',可以用來解決你的例子中的正則表達式搜索問題。如果你只是不時地下載數據,使用'htmlTreeParse'是有點矯枉過正的。 :) – cryo111

+0

@ cryo111:謝謝你的建議。我會研究'XML'包 –

回答

2

無需reshape2或strsplit。

剛:

> jd1 <- read.table(text=mob2008[pat]) 
> head(jd1) 
     V1  V2 V3 V4  V5 
1 8737048 20080101 00:00 0.125 0.270 
2 8737048 20080101 01:00 0.090 0.220 
3 8737048 20080101 02:00 0.070 0.167 
4 8737048 20080101 03:00 0.061 0.093 
5 8737048 20080101 04:00 0.057 0.002 
6 8737048 20080101 05:00 0.052 -0.108 
+0

太棒了,非常感謝你。 –

3
R> jd1 = readLines(textConnection("1 8737048 20080101 00:00 0.125 0.270 
+ 2 8737048 20080101 01:00 0.090 0.220 
+ 3 8737048 20080101 02:00 0.070 0.167 
+ 4 8737048 20080101 03:00 0.061 0.093 
+ 5 8737048 20080101 04:00 0.057 0.002 
+ 6 8737048 20080101 05:00 0.052 -0.108")) 
R> jd1 = data.frame(mob2008.pat. = jd1, stringsAsFactors = FALSE) 
R> jd1 
           mob2008.pat. 
1 1 8737048 20080101 00:00 0.125 0.270 
2 2 8737048 20080101 01:00 0.090 0.220 
3 3 8737048 20080101 02:00 0.070 0.167 
4 4 8737048 20080101 03:00 0.061 0.093 
5 5 8737048 20080101 04:00 0.057 0.002 
6 6 8737048 20080101 05:00 0.052 -0.108 
R> dim(jd1) 
[1] 6 1 
R> jd2 = strsplit(jd1[[1]], " ") 
R> jd2 = lapply(jd2, function(x) x[x != ""]) 
R> jd2 = do.call(rbind, jd2) 
R> data.frame(jd2) 
    X1  X2  X3 X4 X5  X6 
1 1 8737048 20080101 00:00 0.125 0.270 
2 2 8737048 20080101 01:00 0.090 0.220 
3 3 8737048 20080101 02:00 0.070 0.167 
4 4 8737048 20080101 03:00 0.061 0.093 
5 5 8737048 20080101 04:00 0.057 0.002 
6 6 8737048 20080101 05:00 0.052 -0.108 

這有6列,但刪除行號列很容易,並會給你所需的5列。

+0

謝謝你的解決方案。 –

+1

@Jdbaba沒問題。給自己一個複選標記!你的解決方案比我的好得多 –

2

我發現使用包reshape2和功能colsplit

我的問題解決方案中的解決方案如下:

library(reshape2) 
> jd1<- colsplit(mob2008[pat],pattern="\\s+" ,names=c("V1","V2","V3","V4","V5")) 
> head(jd1) 
     V1  V2 V3 V4  V5 
1 8737048 20080101 00:00 0.125 0.270 
2 8737048 20080101 01:00 0.090 0.220 
3 8737048 20080101 02:00 0.070 0.167 
4 8737048 20080101 03:00 0.061 0.093 
5 8737048 20080101 04:00 0.057 0.002 
6 8737048 20080101 05:00 0.052 -0.108