【问题标题】:Read several observables of several variables of several objects读取几个对象的几个变量的几个 observables
【发布时间】:2017-06-27 16:07:33
【问题描述】:

我想从文件中读取数据到 R。在这个文件中,我有很多设备,并且每次每个设备都有很多测量点(电流对电压)(在开头由 SN 标识)。因此,对于每个设备,我有两组不同的测量值:

Before:
SN Temp rad grid grid_pos M Ubias Id M(for_1/M_dM/dV) 1/M_dM/dV
0711006316 0 0 47 1 1.000562 29.949368 -0.024111 0.999974 0.011783
0711006316 0 0 47 1 1.00222 54.997185 0.00171 1.001218 0.03954

After:
SN Temp rad grid grid_pos M Ubias Id 1/M_dM/dV
0711006316 0 0 47 1 31.1330427146 315.723640081 0.95654705303 2.90068387639
0711006316 0 0 47 1 32.4380778593 317.136008883 0.992233239064 2.93656451266
0711006316 0 0 47 1 33.8091346758 318.548377685 1.02972478771 2.97426034878
0711006316 0 0 47 1 35.2513676252 319.960746486 1.06916264771 3.01391310149
0711006316 0 0 47 1 36.7704819283 321.373115288 1.11070282833 3.05567963014


Before:
SN Temp rad grid grid_pos M Ubias Id M(for_1/M_dM/dV) 1/M_dM/dV
0711006319 0 0 47 1 1.000560 29.942378 -0.024012 0.999321 0.011782
0711006319 0 0 47 1 1.00223 54.997155 0.00170 1.001218 0.03954
0711006319 0 0 47 1 1.00286 56.747125 0.0018 1.001421 0.04671

After:
SN Temp rad grid grid_pos M Ubias Id 1/M_dM/dV
0711006319 0 0 47 1 31.1330422116 315.727640051 0.95655702303 2.90068287633
0711006319 0 0 47 1 32.6382778523 317.138008287 0.992233219078 2.95686421961
0711006319 0 0 47 1 33.8091346758 318.548377685 1.02972478771 2.98426037887
0711006319 0 0 47 1 37.2513276222 319.990742488 1.03956224774 3.01321314158

我一般都知道如何读入数据:但我不知道如何处理这些东西。甚至花了我几天的时间在 C++ 中。在遥远的将来,我想将它直接从 C++ 传递给 R,但目前我想熟悉 R。我在文件格式方面遇到了问题,如下所示:我不知道如何区分不同的设备。并通过将他们的两组测量点(之前/之后)保持在一起。

底线:我想像在 C++ 中一样处理这些数据,我会将两组测量点分别存储到代表每个设备的向量中。如何在 R 中做到这一点?

PS:我将数据更改如下:

Before:
(...)
912009897 1.00324 19.9895
912009897 1.01954 79.9714
912009897 1.02694 84.982
912009897 243.522 359.998
912009897 295.017 361.998
912009897 370.227 364.001
912009897 489.931 365.999
912009897 709.234 368
912009897 1235.31 370
912009897 3939.82 372.001
912009912 0.998576 19.9797
912009912 1.70584 169.929
912009912 1.96067 179.926
912009912 2.28553 189.926
912009912 23.2988 305.969
912009912 49.2436 331.969
912009912 52.6625 333.961
912009912 56.4583 335.971
912009912 462.716 369.983
912009912 651.679 371.975
912009912 1074.7 373.985
912009912 2740.88 375.986
912009895 1.00474 49.9612
912009895 1.005 29.9478
912009895 1.00504 54.9601
912009895 1.00524 19.9774
912009895 1.00598 59.9602
912009895 1.00962 64.9591
912009895 1.01166 69.9575
912009895 1.01368 74.9605
912009895 1.01877 79.9679
(...)

After:
(...)
711006316 1.00056 29.9494
711006316 1.00222 54.9972
711006316 1.00241 34.9388
711006316 1.00314 59.9988
711006316 2.68367 199.964
711006316 3.17968 209.963
711006316 3.79324 219.952
711006316 4.55159 229.942
711006316 5.50147 239.946
711006316 598.444 369.932
711006316 935.255 371.926
711006316 1940.84 373.938
711006317 0.998282 34.9308
711006317 0.998532 39.9208
711006317 1.00056 44.9126
711006317 1.00126 54.9591
711006317 1.00339 59.9696
711006317 1.04151 99.9741
711006317 204.89 359.954
711006317 1133.84 371.958
711006317 2794.96 373.963
711006319 1.00166 24.9969
711006319 1.03296 95.0028
711006319 1.04324 100.002
711006319 1.07155 110.005
711006319 1.11089 120
711006319 1.17016 129.988
(...)

现在我只需要知道如何将这些表中的设备和数据点匹配在一起。例如。 SN/ID 为 711006319 的设备有六个用于“后”情况的数据点,因此在 R 中我只想拟合这六个数据点。对于具有 9 个数据点的 SN/ID 711006317 的设备也是如此。所以我必须以某种方式从该表中提取相应的数据点并将它们分配给适当的设备。最后,我想为每个设备分别配备自己的数据点:

【问题讨论】:

    标签: r


    【解决方案1】:

    如果有一个可重复的示例来说明您的输入是什么以及您想要数据的目标是什么,这真的很有帮助。

    如果您的问题是关于格式化数据,通常好的做法(正如我所理解和使用的那样)是每一行应该是一个单独的观察/数据点,每列作为一个变量或观察 id。因此,如果您的所有“之前”观察具有完全相同的变量,并且所有“之后”观察具有相同的变量(跨设备),您可以将数据保存为两张表,一张before 和一张after,每个都有一个设备 ID 列(上面的“SN”)和每行所有相应变量的单个数据点,然后只需使用read.table()read.csv() 将两个单独的表读入 R。如果您希望能够轻松地匹配两个表之间的前后观察,您可以创建对应的列before$idafter$id,并使用match() 在它们之间工作。

    我这样说是因为您的 beforeafter 具有不同数量的观察值和不同数量的变量 - 但如果您的变量几乎相同(看起来可能是这种情况),那么您可能想要将它们全部放入一个表中,并带有一个额外的 id 列,用于指示它是“之前”还是“之后”观察,并且对于一个数据集中不存在的任何变量都只有 NA 值。有点取决于你想做什么。

    如果您想了解更多关于在 R 中使用“长”格式的信息,请查看tidyr 页面。

    编辑:

    在不知道您的输入数据格式的情况下(您的示例中的这四个不同的表是否必须单独读取?您可以输入所有“之前”数据合并为一个表还是询问如何将其合并到R?)和您的数据目标(这将决定您需要的数据结构类型),这很难有帮助。但是,这是一个猜测,假设您希望将所有内容都放在一个数据集中(之后您可以根据设备进行子集/聚合/建模,是的,但这将是一个不同的问题):

    #
    # create example data
    #
    before.df <- data.frame("SN" = c(1, 2), "rad" = 0, "grid" = 47, "M" = c(1.000562, 1.00222), "extra" = c(24, 9))
    
    after.df <- data.frame("SN" = c(1, 1, 2, 2), "rad" = 0, "grid" = 47, 
                        "M" = c(31.1330427146, 32.4380778593, 33.8091346758, 36.7704819283))
    
    #
    # create empty "extra" column in after.df to match before.df
    #
    after.df$extra <- NA
    
    #
    # create "time" id in each dataset to indicate before/after observations    
    #
    before.df$time <- 0
    after.df$time <- 1
    
    combined.df <- rbind(before.df, after.df)
    

    【讨论】:

    • 感谢您的链接!我有很多关于电压和电流的测量数据点。所以电压/电流应该是变量,数据点是可观察的。至少 R 在阅读它们时声明了这一点。一个对象是我的设备。背景是:我有超过 10k 个设备,每个设备大约有 30 个相应的测量数据点(电流对电压)。所以对于每个设备来说,一个单独的文件真的很奇怪。但是我可以以任何我想要的方式输出数据,因为我是通过 C++ 生成的,而且我已经用谷歌搜索了很多,但我没有找到合适的方式去......也没有其他任何东西
    • 已根据您的附加信息编辑了答案 - 但如果有一个可重复的小例子来说明您所拥有的以及您想要实现的目标,这将非常有帮助。
    • 感谢您的回复!上面是一个例子(只是更少的数据点和更少的设备),目标不是很清楚,因为我不知道我到底需要多少数据。我想适合每个设备,所以我想我可以将测量结果分成两个表(之前和之后)。然后我在“一列中存储多个变量”下的整洁页面上有相同的示例。只要我可以将每个设备与其他设备分开安装?我将检查 R 是否可以使用通用表中的相应数据点创建单独的对象。
    • 抱歉,目前还不清楚(至少对我而言)您要问的是什么。我试图提供一些代码来给出一个可能的指针(根据您上面的评论,您可以输出一个“之前”和一个“之后”表) - 但您可能想阅读更多关于基本 R 数据结构的内容和命令并考虑具体你想要什么但不知道该怎么做。
    • 嘿,没问题。我只是更新我原来的问题,我想它会很清楚。
    猜你喜欢
    • 2017-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多