我已经听到了一些非常愚蠢的输出格式,这些格式来自我用扫描读到的观察结果。
这是来自(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
问题是:
我的目标是形式日期,时间,价值的数据框架。
所以,我需要一个循环或其他东西,它分析单个列表元素(扫描输出(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))
但是,如果它们具有有效的日期格式,我不知道如何分析列表中的元素(如字符)。
干杯!
答案 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
希望这能解决问题。