【问题标题】:How can I rearrange loaded time series data?如何重新排列加载的时间序列数据?
【发布时间】:2013-02-02 09:39:20
【问题描述】:

我得到的是 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

我可以毫无问题地将它加载到 R 中

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

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 中使用的数据集?

提前致谢!

【问题讨论】:

    标签: r data-structures load reshape


    【解决方案1】:

    照常读取您的数据:

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

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

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

    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
    

    【讨论】:

    • 谢谢!效果也很好。可以看到我需要按日期时间排序。当我这样做时,记录数字从 4 到 8 和从 8 到 11 是怎么回事?
    • @MortenGrum,是的。与“reshape2”中的方法不同,reshape 不会假设您要同时对数据进行排序,而是根据 idvariables 按遇到的顺序返回数据。一个简单的mydf[order(mydf$DateTime), ] 将为您解决这个问题。同样,行名称(记录编号)与函数在源数据中遇到该“idvar”的第一行相关。您会注意到“00:10:00”的第一次出现在样本数据的第 8 行,因此这就是您在此处看到的行名。
    【解决方案2】:

    您可以使用reshape2 包做到这一点:

    第一步:melt你的data.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
    

    【讨论】:

    • 太棒了!像魅力一样工作。谢谢!
    • @Arun,你有什么理由使用idvar = names(df)[1:2]?我认为idvar = 1:2 就足够了。当然是 +1。
    • @Ananda,不,不是真的。我通常根本不说idvar。我使用melt(df, names(df)[1:2])。我会修改它。我从未直接使用过索引。感谢您的关注!!
    • @Arun,我实际上更喜欢只输入名称向量,以防我决定更改列的顺序或另一个函数更改列的顺序。我知道这很少见,但我更喜欢尽可能明确。
    猜你喜欢
    • 2018-01-13
    • 1970-01-01
    • 2014-06-19
    • 2021-12-21
    • 2023-01-04
    • 1970-01-01
    • 2021-12-07
    • 2021-01-10
    • 2023-01-05
    相关资源
    最近更新 更多