2016-08-03 93 views
1

我试图将英国各地的气候数据> 30,000个个人.dat文件合并成一个单一的数据文件,我可以然后从中提取年度值。该数据被格式化为使得在每个文件的第一行包含经纬度长为单元格,然后下面是测量的气候变量:R:合并> 1000 .dat文件

54.78 -7.06 
iGrid  x  y  year  month SRad  Tmin  Tmax   vp  wind  rain  sunshine 
19028  56  139 1971  1  2.22  1.25  6.43  7.29  12.33  133.47  1.72 
19028  56  139 1971  2  3.94  1.26  6.74  7.36  11.11  106.64  1.85 
19028  56  139 1971  3  7.30  0.95  7.56  7.05  12.77  57.26  2.57 
19028  56  139 1971  4  12.09  2.29  10.07  7.71  11.02  112.81  4.24 
19028  56  139 1971  5  15.51  4.85  13.07  9.20  13.94  103.08  5.02 
19028  56  139 1971  6  16.18  6.36  14.09  9.98  12.44  115.03  4.76 
19028  56  139 1971  7  15.59  9.25  17.56  12.83  10.45  107.18  4.73 
19028  56  139 1971  8  11.92  9.20  15.98  12.70  11.39  136.40  3.35 
19028  56  139 1971  9  9.69  7.85  16.31  12.72  12.24  41.76  4.11 
19028  56  139 1971  10  5.43  6.96  12.88  10.56  16.55  99.72  2.90 
19028  56  139 1971  11  2.55  2.78  8.36  8.39  17.98  195.24  1.56 
19028  56  139 1971  12  1.51  3.29  8.02  8.68  16.74  54.63  0.89 
19028  56  139 1972  1  1.96  -0.30  4.79  6.78  16.55  168.39  1.07 
19028  56  139 1972  2  4.23  0.29  5.78  6.97  15.97  114.47  2.33 
19028  56  139 1972  3  7.80  0.53  7.54  7.71  14.02  165.09  3.14 
19028  56  139 1972  4  12.51  2.80  10.32  8.26  13.39  116.30  4.63 
19028  56  139 1972  5  14.49  4.46  11.50  8.98  15.54  187.31  4.17 
19028  56  139 1972  6  16.95  5.36  12.90  9.50  12.45  123.17  5.39 
19028  56  139 1972  7  15.35  8.61  16.81  12.63  7.41  105.49  4.53 
19028  56  139 1972  8  11.40  8.04  15.17  11.66  11.85  86.44  2.88 
19028  56  139 1972  9  9.60  5.54  14.03  10.19  9.96  24.70  4.01 
19028  56  139 1972  10  5.29  6.04  12.06  10.27  12.92  79.35  2.70 
19028  56  139 1972  11  2.49  1.74  7.09  8.02  14.79  169.47  1.43 
19028  56  139 1972  12  1.55  1.80  7.45  8.00  17.66  153.31  1.01 
19028  56  139 1973  1  1.73  2.16  6.32  7.98  15.25  202.89  0.52 
19028  56  139 1973  2  4.08  0.27  5.47  7.17  14.71  126.04  2.07 
19028  56  139 1973  3  8.05  0.90  8.30  7.24  13.64  49.84  3.43 
19028  56  139 1973  4  12.54  1.98  9.05  7.27  13.02  86.45  4.66 
19028  56  139 1973  5  14.55  4.71  12.37  9.41  13.18  102.20  4.22 
19028  56  139 1973  6  16.05  7.42  16.17  11.17  10.93  64.45  4.65 
19028  56  139 1973  7  13.72  9.66  16.39  12.82  8.16  111.27  3.18 
19028  56  139 1973  8  12.23  9.62  17.07  12.93  10.37  97.53  3.62 
19028  56  139 1973  9  9.11  7.95  15.02  11.65  12.63  116.15  3.49 
19028  56  139 1973  10  5.23  4.51  10.78  9.45  10.27  71.68  2.61 
19028  56  139 1973  11  2.37  1.84  7.63  7.91  14.48  162.53  1.17 
19028  56  139 1973  12  1.56  1.19  6.79  7.72  14.65  174.89  1.03 

阅读以前的答案(Thisthis)已经帮我在这抵达代码:

library(data.table) 

filenames <- list.files(path="/mydirectory", 
        pattern = ".dat", full.names=T) 

temp <- lapply(filenames, fread, sep=",") 
data <- rbindlist(temp) 

write.table(data,"metcombi.dat", sep=",") 

其中吐出一个巨大的.dat文件(输入文件占用2.5GB〜),但在每一个文件的末尾它重复列标题并清除纬度长值。

1)如何阻止它重复我正在合并的每个文件的列标题? 2)如何从每个文件的第一行中提取lat long值并将它们移动到新列?

谢谢!

+0

请出示实际的文件,而不是这个奇怪的结构。使用'skip'参数读取没有坐标的数据,然后使用'nrow'数据只读取坐标。然后将这两个数据组合成一个data.table,并使用'lat'和'long'列和'rbindlist'。 – Roland

+0

我想列表项是data.tables。你尝试过'data.table :: merge'吗? –

+0

嗨,罗兰,我会尽快更新我的答案与实际的文件,但除了使用dput我不明白我怎么能做到这一点。 –

回答

2

考虑扩大您的lapply()做第一线的快速阅读,在.dat文件到数据帧读,然后分经/纬度第一线列:

filenames <- list.files(path="/mydirectory", 
         pattern=".dat", full.names=TRUE) 

dfList <- lapply(filenames, function(f){ 
    # FIRST LINES 
    con <- file(description=f, open="r") 
    latlong <- readLines(con, warn=FALSE)[1] 
    close(con) 

    # DATA FRAME 
    df <- read.table(f, skip=1, header=TRUE) 
    df$lat <- strsplit(latlong, "\\s+")[[1]][1] 
    df$lon <- strsplit(latlong, "\\s+")[[1]][2] 

    return(df) 
}) 

data <- rbindlist(dfList) 

write.csv(data, "metcombi.dat") 
+0

感谢@Parfait的帮助。运行代码并得到一条错误消息,我尝试调试:'Error in read.table(f,skip = 1,header = TRUE): 输入中没有可用行 4 stop(“输入中没有可用行“) 3 read.table(f,skip = 1,header = TRUE) 2 FUN(X [[i]],...) 1 lapply(文件名,函数(f){<描述= f,打开=“r”) latlong < - readLines(con,warn = FALSE)[1] close(con)...' –

+0

在'file'的帮助中,它提到“最多可以在任何时候分配128个连接(不一定是打开的)。”因为我有35136个输入文件,这可能是问题吗? –

+0

非常感谢您的帮助。代码有效(错误是由于输入文件损坏引起的),我只需要将lat延长到正确的列中,因为当前lat将进入长列,并且不会传输lat数据。 –

0

从我了解的问题上面,我建议分两个阶段解析文件:

首先,抓住从每个文件的第一行,如:

headers <- data.frame() 

for (filename in filenames) { 
    fp = open(filename) 
    headers <- rbind(headers, readLines(fp, n=1)) 
    close(fp) 
} 

接下来,用你的相同的代码以上遍历的文件和抓住从他们每个人的主数据,但使用类似header=TRUEskip=1跳过标题行:

... 
temp <- lapply(filenames, fread, sep=",", header=TRUE) 
data <- rbindlist(temp) 

剩下要做的唯一事情就是从第一个循环中加入经纬度信息。我不确定格式是什么,但这可能与两个data.frames上的cbind()调用一样简单。

+0

谢谢你的建议,我会尝试将它们付诸行动,看看会发生什么。 –