2013-02-02 38 views
3

我有什么是一个txt文件(mydata.txt)这样的数据:如何重新排列加载的时间序列数据?

Variable, DateTime, Value, Quality 
A, 01-01-1970 00:00:00, 0, 0 
A, 01-01-1970 00:02:00, 2, 2 
A, 01-01-1970 00:04:00, 4, 1 
A, 01-01-1970 00:06:00, 6, 0 
B, 01-01-1970 00:02:00, 0.2, 0 
B, 01-01-1970 00:04:00, 0.4, 1 
B, 01-01-1970 00:06:00, 0.6, 1 
B, 01-01-1970 00:10:00, 1.0, 0 
C, 01-01-1970 00:00:00, 20.0, 0 
C, 01-01-1970 00:04:00, 16.0, 0 
C, 01-01-1970 00:08:00, 12.0, 3 

我可以将其与

read.csv("mydata.txt", header = TRUE, sep = ",") 

加载成R没有问题
read.table("mydata.txt", header = TRUE, sep = ",") 

但是我想与r一起工作会是这样的:

DateTime, A_Value, A_Quality, B_Value, B_Quality, C_Value, C_Quality 
01-01-1970 00:00:00, 0, 0, NA, NA, 20.0, 0 
01-01-1970 00:02:00, 2, 2, 0.2, 0, NA, NA 
01-01-1970 00:04:00, 4, 1, 0.4, 1, 16.0, 0 
01-01-1970 00:06:00, 6, 0, 0.6, 1, NA, NA 
01-01-1970 00:08:00, NA, NA, NA, NA, 12.0, 3 
01-01-1970 00:10:00, NA, NA, 1.0, 0, NA, NA 

(其中第一列是日期/时间类型)。

我不知道我的文件中有多少个变量(即A,B,... Z),我不知道他们的名字 - 我所知道的只是他们的专栏。

我如何从我在文本文件中的数据集中获取到我希望在R中使用的数据集?

在此先感谢!

第一步:

回答

4

阅读你的数据作为正常:

mydata <- read.table("mydata.txt", header = TRUE, sep = ",") 

然后使用几种方法之一将其从所谓的“长”格式“重塑”为“宽”格式。

这是在基础R只是1行中使用reshape

reshape(mydata, direction = "wide", idvar = "DateTime", timevar = "Variable") 
#    DateTime Value.A Quality.A Value.B Quality.B Value.C Quality.C 
# 1 01-01-1970 00:00:00  0   0  NA  NA  20   0 
# 2 01-01-1970 00:02:00  2   2  0.2   0  NA  NA 
# 3 01-01-1970 00:04:00  4   1  0.4   1  16   0 
# 4 01-01-1970 00:06:00  6   0  0.6   1  NA  NA 
# 8 01-01-1970 00:10:00  NA  NA  1.0   0  NA  NA 
# 11 01-01-1970 00:08:00  NA  NA  NA  NA  12   3 
+0

谢谢!工作得很好。可以看到我需要按日期排序。当我这样做时,记录数字从4到8,从8到11是什么? –

+0

@MortenGrum,是的。与“reshape2”的方法不同,“reshape”不会假设您想要同时对数据进行排序,但会按照遇到的顺序根据idvariables返回数据。一个简单的'mydf [order(mydf $ DateTime)]''会为你照顾。同样,行名称(记录号)与函数在源数据中遇到“idvar”的第一行相关。您会注意到第一次“00:10:00”在您的示例数据的第8行,因此这是您在此处看到的行名。 – A5C1D2H2I1M1N2O1R2T1

4

您可以使用reshape2包做meltdata.frame

require(reshape2) 
df.m <- melt(df, id.var = 1:2) # changed names(df)[1:2] to 1:2 (following @Anandamahto's comment) 

第二步:cast的结果:

dcast(df.m, DateTime ~ Variable + variable, fill=NA) 

#    DateTime A_Value A_Quality B_Value B_Quality C_Value C_Quality 
# 1 01-01-1970 00:00:00  0   0  NA  NA  20   0 
# 2 01-01-1970 00:02:00  2   2  0.2   0  NA  NA 
# 3 01-01-1970 00:04:00  4   1  0.4   1  16   0 
# 4 01-01-1970 00:06:00  6   0  0.6   1  NA  NA 
# 5 01-01-1970 00:08:00  NA  NA  NA  NA  12   3 
# 6 01-01-1970 00:10:00  NA  NA  1.0   0  NA  NA 
+1

真棒!像魅力一样工作。谢谢! –

+1

@Arun,你使用'idvar = names(df)[1:2]''的任何原因?我认为'idvar = 1:2'就足够了。 +1,当然。 – A5C1D2H2I1M1N2O1R2T1

+0

@Ananda,不,不是。我通常不会说'idvar'。我使用熔化(df,names(df)[1:2])''。我会修改它。我从来没有直接使用过指数。感谢您的注意! – Arun