R:如何在扫描输出中查询日期格式?

时间:2016-10-14 09:44:00

标签: r list date format character

我已经听到了一些非常愚蠢的输出格式,这些格式来自我用扫描读到的观察结果。

这是来自(data.dat)的snipplet,我在其中标记了标题和数据块:

06.02.2014    # header
PNP         
-0,005 
00:05#587     # values 
00:15#591  
23:50#587  
23:55#587
07.02.2014    # header
PNP
-0,005
00:10#587     # values
00:15#590  
23:55#590  
24:00#593
08.02.2014    # header
PNP
-0,005
00:05#590     # value
00:10#595  
00:15#600  
23:50#600  
23:55#607

问题是:

  • 我以5分钟的分辨率获得了几年的约会,
  • 每天都有自己的标题(常量长度),从日期和另外两个条目开始,
  • 每天的时间序列长度(格式HH:MM#值)不恒定,存在数据空白(示例中未显示)

我的目标是形式日期,时间,价值的数据框架。

所以,我需要一个循环或其他东西,它分析单个列表元素(扫描输出(file = data.dat,what ="")为字符) 。由于时间块具有不同的长度,我希望将我的日常数据从日期开始进行子集化,跳过一些其他标题元素,而不是strsplit列表的时间#value元素,这些元素已由

crap     <- scan(file = data.dat, what=" ")   # import as list

strsplit适用于

tmp <- strsplit(crap[4:8], split="#")
df  <- data.frame(date=as.Date(crap[1],format = "%d.%m.%Y"), time=sapply(tmp, "[[", 1), W=sapply(tmp, "[[", 2)) 

但是,如果它们具有有效的日期格式,我不知道如何分析列表中的元素(如字符)。

干杯!

1 个答案:

答案 0 :(得分:0)

我有一个解决方案,但它可能对您提出的问题和我解释的内容非常具体。

首先读取数据并从数据中删除PNP and -0,005

crap     <- read.table(file = "data.dat",comment.char = " ")
a        <- as.vector(crap$V1)
a        <- a[-grep("PNP|-0,005",x = a)]

现在我提取向量a

中包含的日期
dateId   <- grep(".",x=a,fixed=T)
uniquedate    <- as.matrix(a[dateId])
> uniquedate
     [,1]        
[1,] "06.02.2014"
[2,] "07.02.2014"
[3,] "08.02.2014"

现在我创建一个与no相同长度的日期向量。数据集中的值通过重复相应日期中存在的值数的日期。

len      <- length(dateId)
dateRepVal    <- c(diff(dateId)-1,(length(a) - dateId[len]))
dates     <- unlist(sapply(1:len,FUN = function(x){rep(uniquedate[x],dateRepVal[x])}))

所有其他元素都希望我们的数据集"a"中的日期是时间 - 值对。现在使用此信息我可以使用strsplit函数获取时间和值,然后创建数据框。

timeVal   <- strsplit(a[-dateId],split = "#")
time      <- sapply(timeVal, "[[", 1)
val       <- sapply(timeVal, "[[", 2)
DF        <- data.frame(date = dates,time=time,val=val)

最终所需输出如下所示。

>DF
         date  time val
1  06.02.2014 00:05 587
2  06.02.2014 00:15 591
3  06.02.2014 23:50 587
4  06.02.2014 23:55 587
5  07.02.2014 00:10 587
6  07.02.2014 00:15 590
7  07.02.2014 23:55 590
8  07.02.2014 24:00 593
9  08.02.2014 00:05 590
10 08.02.2014 00:10 595
11 08.02.2014 00:15 600
12 08.02.2014 23:50 600
13 08.02.2014 23:55 607

希望这能解决问题。