搜索subheader文本并对一系列时间序列数据进行子集化

时间:2014-06-03 13:10:16

标签: r grep time-series subset

我有一个大型数据集,其中包含多个子流域(A,B,C ......)的月流量值,模拟了29年或30年(均为1973年10月开始日期) )。针对每个子流域模拟了多个土地利用情景(L0,L1,L2 ......)。缩写的大数据集(模拟输出)看起来像:

    L1  L2  L3  L4
Region A    Region A    Region A    Region A    Region A
Oct-73  1158.253987 1277.609802 2075.07222  1175.180347
Nov-73  899.9971049 963.3400574 1236.908427 928.1986959
Dec-73  2014.242414 2843.617772 2476.0352   1900.601679
Region B    Region B    Region B    Region B    Region B
Oct-73  45514.94664 43541.93996 45940.96497 35874.90373
Nov-73  42958.17496 40040.20911 54143.22215 44822.27867
Dec-73  20940.68607 18940.04229 27982.01634 22694.99206
Region C    Region C    Region C    Region C    Region C
Oct-73  36217.37806 39242.19258 55190.01608 41717.96882
Nov-73  30222.61064 39706.71856 31948.43095 29478.23702
Dec-73  25278.32554 29620.78396 25610.99175 24595.77577

我在R中尝试了很多方法来解析/子集数据。我想一次在一个区域(一系列行)中对某些场景(列)进行子集化。例如,为区域B定义一个新的数据帧,包括L1,L2和L3的所有月份和年份。这是一个庞大的数据集,我试图做的是搜索数据中的副标题文本字符串(即"区域B")并在子标题下面设置一定数量的行。

mydf <- data.frame(my)
linenumber <- as.numeric(row.names(mydf[grepl("Region B", mydf$L1),]))
start <- linenumber+1
end <- linenumber+360
keep.col <- c(L1","L2","L3")
mydf.sub <- mydf[start:end, names(mydf) %in% keep.col]

这不起作用,因为每个月的时间序列不是360个月(30年)长。有些人是29年。有关如何搜索特定文本字符串的数据以及如何在该子标题下方对一系列数据进行子集的建议?我认为嵌入在大数值数据矩阵中的子标题是驱动问题。

1 个答案:

答案 0 :(得分:0)

读入文件跳过行1.然后创建一个逻辑向量g,每个标题为TRUE,每个数据行为FALSE。 cumsum(g)对于第一个区域的标题和数据行为1,对于第二个区域为2,等等。名称nms是标题中两个空格之前的所有内容。最后定义读取单个Region的reader

L <- readLines("myfile.dat")[-1] ##
is.region <- grepl("Region", L)
g <- cumsum(is.region)
nms <- sub("  +.*", "", L[is.region])
reader <- function(x) read.table(text = x, skip = 1)

现在我们可以这样做:

reader(L[nms == "Region A"]) # extract just Region A

reader(L[g == 1]) # same

LDF <- tapply(L, nms[g], reader)  # LDF is a list of all regions
LDF[["Region A"]] # extract just Region A
LDF[[1]] # same

LDF看起来像这样:

> LDF
$`Region A`
      V1        V2        V3       V4        V5
1 Oct-73 1158.2540 1277.6098 2075.072 1175.1803
2 Nov-73  899.9971  963.3401 1236.908  928.1987
3 Dec-73 2014.2424 2843.6178 2476.035 1900.6017

$`Region B`
      V1       V2       V3       V4       V5
1 Oct-73 45514.95 43541.94 45940.96 35874.90
2 Nov-73 42958.17 40040.21 54143.22 44822.28
3 Dec-73 20940.69 18940.04 27982.02 22694.99

$`Region C`
      V1       V2       V3       V4       V5
1 Oct-73 36217.38 39242.19 55190.02 41717.97
2 Nov-73 30222.61 39706.72 31948.43 29478.24
3 Dec-73 25278.33 29620.78 25610.99 24595.78

为了重现性,L可用于代替上面标有##的第一行:

L <- c("Region A    Region A    Region A    Region A    Region A", 
"Oct-73  1158.253987 1277.609802 2075.07222  1175.180347", 
"Nov-73  899.9971049 963.3400574 1236.908427 928.1986959", 
"Dec-73  2014.242414 2843.617772 2476.0352   1900.601679", 
"Region B    Region B    Region B    Region B    Region B", 
"Oct-73  45514.94664 43541.93996 45940.96497 35874.90373", 
"Nov-73  42958.17496 40040.20911 54143.22215 44822.27867", 
"Dec-73  20940.68607 18940.04229 27982.01634 22694.99206", 
"Region C    Region C    Region C    Region C    Region C", 
"Oct-73  36217.37806 39242.19258 55190.01608 41717.96882", 
"Nov-73  30222.61064 39706.71856 31948.43095 29478.23702", 
"Dec-73  25278.32554 29620.78396 25610.99175 24595.77577")

更新一些改进。