【问题标题】:R - Loading in data for specific datesR - 加载特定日期的数据
【发布时间】:2022-08-18 18:08:09
【问题描述】:

我需要将很多文件加载到 R 中,所有这些文件的名称中都隐藏了一个日期,如下所示: SD07_TWK_20190822_003004

我想选择根据这些日期加载的文件。

我像这样将文件加载到 R 中:

filenames = list.files(path=path, pattern=\".txt\") 
colnamesfull = c(\"time\",\"v\",\"a\",\"t1\",\"t2\",\"t3\",\"t4\",\"t5\",\"t6\",\"t7\",\"t8\")

for(i in filenames){
  filepath = file.path(path, paste(i, sep=\"\"))
  assign(i, read.table(filepath,
                       skip= 20, 
                       col.names= colnamesfull, 
                       sep=\",\")
                       )}

为了过滤日期,我假设我需要在 list.files 函数的 \'pattern\' 中添加一个日期范围。但是,我无法让它发挥作用。

假设我有以下日期:

date_start = \"20190822\"
date_end = \"20190823\"

如何将这些日期的过滤器添加到上面的代码中?

代码和文件示例:

#path = \"C:/path\"
filenames = list.files(path=path, pattern=\".txt\")
names = substr(filenames,10,17) 
date_start = \"20190822\"
date_end = \"20190822\"

for(i in filenames){
  filepath = file.path(path, paste(i, sep=\"\"))
  if( (date_start <= names  &&  
       names <= date_end)){
    assign(i, read.table(filepath, skip=20, col.names = colnamesfull, sep=\",\"))
  }
}

一些文件:

> dput(file1)
structure(list(time = c(2, 3.9, 5.8, 7.8, 9.7, 11.7, 13.6, 15.5, 
17.5, 19.4), v = c(14.82, 14.804, 14.82, 14.82, 14.804, 14.82, 
14.812, 14.804, 14.8, 14.808), a = c(1.5, 1.476, 1.5, 1.491, 
1.452, 1.476, 1.478, 1.44, 1.454, 1.438), t1 = c(14.61, 14.61, 
14.61, 14.61, 14.61, 14.61, 14.61, 14.62, 14.62, 14.63), t2 = c(14.63, 
14.62, 14.62, 14.62, 14.62, 14.62, 14.62, 14.63, 14.63, 14.64
), t3 = c(14.63, 14.63, 14.63, 14.63, 14.63, 14.63, 14.63, 14.63, 
14.64, 14.65), t4 = c(14.65, 14.65, 14.65, 14.65, 14.64, 14.64, 
14.65, 14.65, 14.66, 14.67), t5 = c(14.65, 14.65, 14.65, 14.65, 
14.65, 14.65, 14.66, 14.66, 14.67, 14.69), t6 = c(14.63, 14.63, 
14.63, 14.63, 14.63, 14.63, 14.63, 14.64, 14.65, 14.66), t7 = c(14.64, 
14.64, 14.64, 14.64, 14.64, 14.64, 14.64, 14.64, 14.65, 14.66
), t8 = c(14.6, 14.6, 14.6, 14.6, 14.6, 14.6, 14.61, 14.61, 14.62, 
14.63)), row.names = c(NA, 10L), class = \"data.frame\")
> dput(file2)
structure(list(time = c(2, 3.9, 5.9, 7.8, 9.7, 11.7, 13.6, 15.6, 
17.5, 19.5), v = c(14.808, 14.808, 14.816, 14.816, 14.808, 14.804, 
14.816, 14.8, 14.808, 14.808), a = c(1.478, 1.472, 1.491, 1.49, 
1.47, 1.484, 1.452, 1.473, 1.465, 1.482), t1 = c(14.63, 14.63, 
14.63, 14.63, 14.62, 14.62, 14.63, 14.63, 14.63, 14.64), t2 = c(14.64, 
14.64, 14.64, 14.64, 14.64, 14.64, 14.64, 14.64, 14.65, 14.65
), t3 = c(14.65, 14.65, 14.65, 14.65, 14.65, 14.64, 14.65, 14.65, 
14.65, 14.66), t4 = c(14.66, 14.66, 14.66, 14.66, 14.66, 14.66, 
14.66, 14.67, 14.67, 14.68), t5 = c(14.67, 14.67, 14.67, 14.67, 
14.67, 14.67, 14.67, 14.68, 14.69, 14.7), t6 = c(14.65, 14.65, 
14.65, 14.65, 14.65, 14.65, 14.65, 14.65, 14.66, 14.67), t7 = c(14.65, 
14.65, 14.65, 14.65, 14.65, 14.65, 14.65, 14.66, 14.66, 14.67
), t8 = c(14.62, 14.62, 14.62, 14.62, 14.62, 14.62, 14.62, 14.62, 
14.63, 14.64)), row.names = c(NA, 10L), class = \"data.frame\")

    标签: r database date loading


    【解决方案1】:

    从遵循"SD07_TWK_20190822_003004" 模式的文件名开始,您可以将日期提取为字符 10 到 17:

    > substr("SD07_TWK_20190822_003004", 10, 17)
    [1] "20190822"
    

    现在这是一个字符串。但是当某个聪明的人以合理的顺序排列年、月和日期时,您可以比较这些字符串,就好像它们是日期一样:

    example <- substr("SD07_TWK_20190822_003004", 10, 17)
    date_start = "20190822"
    date_end = "20190823"
    
    example >= date_start
    example < date_end
    

    现在,如果您想查看日期是否在date_startdate_end 之间,则类似于

    > date_start <= example & example <= date_end
    [1] TRUE
    

    让我们尝试提前一个月和一年后的日期,看看我们是否得到了想要的FALSE

    > example = "20190722"
    > date_start <= example & example <= date_end
    [1] FALSE
    > example = "20200822"
    > date_start <= example & example <= date_end
    [1] FALSE
    

    太好了,现在您所要做的就是使用 if 语句在循环中设置 assign 条件,类似于以下内容

    if( (start_date <= substr(filepath, 10, 17))  &  
        (substr(filepath, 10, 17) <= end_date  ) ){
            assign(....)
    }
    

    如果不提供重新考虑的建议,我无法关闭assign 是否是一个不错的选择。您可能应该将那些 data.frames 存储在一个列表中,但这不是这个问题的主题。

    【讨论】:

    • 嘿,伯纳德,非常感谢您的帮助!它一直工作到最后,在 if 循环中我收到以下错误:Error in if ((date_start &lt;= substr(filenames, 10, 17)) &amp; (substr(filenames, : the condition has length &gt; 1
    • 此外,您将数据帧存储在列表中是完全正确的。这是我之后要做的一个步骤,如果可能的话,我想跳过这个加载步骤。如果您也想提供帮助,那就太好了,但是我会提出另一个问题:)
    • 对于错误消息:如果没有可重现的示例(即重现错误的代码和示例数据),进行调试确实非常困难。您可能只需将&amp; 切换为&amp;&amp;,但显然您会想探索这些括号的评估结果和理解,问题出在哪里。如果它不起作用,您将不得不经历构建可重现示例的过程。
    • 至于在for 循环中构建列表,通过搜索此站点可能会找到很多答案。一个不错的选择是使用append 命令逐步构建它,正如我在这个答案中所展示的那样:stackoverflow.com/a/73394451/6503141 如果这样可以省去你提出新问题的麻烦,请考虑在那里投票。
    猜你喜欢
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 2017-09-12
    • 1970-01-01
    • 1970-01-01
    • 2014-12-11
    • 2016-04-25
    相关资源
    最近更新 更多