【问题标题】:How can I save a list to a file and read it in again (in R)?如何将列表保存到文件并再次读入(在 R 中)?
【发布时间】:2015-10-31 20:23:32
【问题描述】:

我已经用 R 中的 poLCA 包估计了一个模型,并希望将起始值保存到一个文件中,这样我就可以随时重新估计完全相同的模型。

这是一个模型的起始值列表:

List of 8
 $ : num [1:2, 1:6] 0.219 0.193 0.16 0.193 0.184 ...
 $ : num [1:2, 1:6] 0.0731 0.2054 0.228 0.144 0.2028 ...
 $ : num [1:2, 1:6] 0.0396 0.0965 0.0286 0.1494 0.1609 ...
 $ : num [1:2, 1:6] 0.20998 0.173634 0.105792 0.000588 0.06236 ...
 $ : num [1:2, 1:6] 0.163 0.19 0.167 0.178 0.246 ...
 $ : num [1:2, 1:6] 0.1602 0.1438 0.1963 0.0848 0.2218 ...
 $ : num [1:2, 1:6] 0.0298 0.3022 0.2179 0.094 0.0228 ...
 $ : num [1:2, 1:6] 0.0167 0.2444 0.3257 0.1298 0.3652 ...

这些都是它的价值:

> starting.values

[[1]]
          [,1]      [,2]       [,3]        [,4]      [,5]      [,6]
[1,] 0.2188410 0.1602971 0.18446855 0.002413188 0.1841924 0.2497878
[2,] 0.1927328 0.1926757 0.04098356 0.104583224 0.1583117 0.3107131

[[2]]
           [,1]      [,2]      [,3]      [,4]       [,5]      [,6]
[1,] 0.07310624 0.2280248 0.2027862 0.2274362 0.03105063 0.2375959
[2,] 0.20535603 0.1439554 0.1869197 0.1317791 0.20698352 0.1250063

[[3]]
           [,1]       [,2]      [,3]      [,4]       [,5]      [,6]
[1,] 0.03955110 0.02855405 0.1609203 0.3375032 0.15405189 0.2794195
[2,] 0.09650825 0.14942635 0.1016048 0.2445582 0.07646363 0.3314387

[[4]]
          [,1]         [,2]       [,3]       [,4]      [,5]      [,6]
[1,] 0.2099798 0.1057921697 0.06235958 0.06833102 0.2474372 0.3061002
[2,] 0.1736344 0.0005879314 0.06184313 0.36905589 0.2575882 0.1372904

[[5]]
          [,1]      [,2]      [,3]      [,4]      [,5]       [,6]
[1,] 0.1631299 0.1672565 0.2460589 0.2199485 0.1620184 0.04158786
[2,] 0.1900245 0.1777367 0.1136598 0.1576786 0.1147886 0.24611175

[[6]]
          [,1]       [,2]      [,3]      [,4]      [,5]       [,6]
[1,] 0.1601707 0.19628931 0.2217799 0.1985856 0.1961983 0.02697623
[2,] 0.1437703 0.08483575 0.3475932 0.1029784 0.2134874 0.10733507

[[7]]
          [,1]       [,2]       [,3]      [,4]       [,5]      [,6]
[1,] 0.0297938 0.21786564 0.02278498 0.2173179 0.28299340 0.2292443
[2,] 0.3021657 0.09397824 0.16714915 0.3072889 0.02752554 0.1018925

[[8]]
           [,1]      [,2]      [,3]      [,4]      [,5]       [,6]
[1,] 0.01670364 0.3256942 0.3652010 0.1620259 0.1111144 0.01926083
[2,] 0.24443214 0.1297942 0.3064312 0.1105086 0.1461748 0.06265905

首先我想,我可以将列表转换为数据框并将其保存为 .csv 文件。但我不知道,我将如何读入这个文件以获得与我从模型中获得的完全相同的列表。

我已经查看了 stackoverflow,但没有找到我的问题的答案。我不介意文件是 .csv、.txt 还是一个文件或多个文件。对不起,如果我不能为我的问题提供更多想法或代码。我不知道从哪里开始。

【问题讨论】:

    标签: r list save


    【解决方案1】:
    saveRDS(starting.values, file="fname.RData")
    ?saveRDS
    

    允许您将一个或多个 R 对象保存到单个文件中。

    加载

    readRDS("fname.RData")
    

    (从下面的 cmets 编辑,因为之前的 saveload 函数似乎不再起作用了。)

    【讨论】:

    • 不幸的是,Sam 的第一个解决方案不起作用。加载对象只是给出了字符向量“starting.values”。我不确定,我忘记了什么。 Bens 解决方案确实按预期工作。如果您将其写为答案,我可以接受。
    • 不知道为什么这不起作用,尽管我喜欢 Ben 的建议。以前没用过这些命令。
    • saveload 解决方案也不适用于我。 Ben 的saveRDSreadRDS 解决方案可以。不知道为什么。
    • @Alber8295 参见文档rdocumentation.org/packages/base/versions/3.5.3/topics/readRDSrdocumentation.org/packages/base/versions/3.5.3/topics/load。 load 将变量(具有原始名称)作为副作用*放入您的环境*,并返回变量名称的 char 字符串)。即使用 save(z1, file = filename) 然后加载(filename)
    • 我有错误:错误的恢复文件幻数(文件可能已损坏)-未加载数据另外:警告消息:文件'l_xy.sep'有幻数'c(300'使用不推荐使用 2 之前的保存版本
    【解决方案2】:

    我还建议您探索 rlist 包和提供的 list.save 函数,因为它在保存列表时提供了额外的灵活性。

    示例

    documentation 中提供。

    require(rlist)
    x <- lapply(1:5,function(i) data.frame(a=i,b=i^2))
    list.save(x, 'list.rds')
    list.save(x, 'list.rdata')
    list.save(x, 'list.yaml')
    

    yaml文件预览

    - a: 1
      b: 1.0
    - a: 2
      b: 4.0
    - a: 3
      b: 9.0
    - a: 4
      b: 16.0
    - a: 5
      b: 25.0
    

    然后您可以使用同一包中的list.load 函数加载列表,或者您可以从导出的yaml 文件中读取行。您还可以考虑查看list.select 函数并从列表中选择对象。话虽如此,我认为解决此问题的最简单方法是简单地存储/加载完整的列表对象。

    【讨论】:

      【解决方案3】:

      对于那些正在获取字符名称的变量。

      vect_to_save <- c(1,2,3)
      save(vect_to_save, file="vec.RData")  # Till here everything is ok. 
      
      # Now, see the difference
      vect_to_save <- load(file="vec.RData")
      print(vect_to_save)  # Prints "vect_to_save"
      
      # To load you have to
      load(file="vec.RData")
      print(vect_to_save)  # Now, yes!
      # [1] 1 2 3
      

      不要将load() 的输出分配给变量。它直接将 var 加载到工作区中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-01
        • 2018-01-17
        • 1970-01-01
        • 2014-04-06
        • 1970-01-01
        相关资源
        最近更新 更多