【问题标题】:Add extra column to a list of .txt files based on keywords根据关键字将额外列添加到 .txt 文件列表
【发布时间】:2021-06-26 07:46:25
【问题描述】:

我有一个包含 100 个文本文件的列表,其中包含属于英国每个站点的温度值。但是,除了手动操作之外,我无法在循环中区分它们。

我希望它们被关键字检测到,然后通过选择的名称来属性列向量,例如:

EUROPEAN CLIMATE ASSESSMENT & DATASET (ECA&D), file created on 25-06-2021
THESE DATA CAN BE USED FREELY PROVIDED THAT THE FOLLOWING SOURCE IS ACKNOWLEDGED:

Klein Tank, A.M.G. and Coauthors, 2002. Daily dataset of 20th-century surface
air temperature and precipitation series for the European Climate Assessment.
Int. J. of Climatol., 22, 1441-1453.
Data and metadata available at http://www.ecad.eu

FILE FORMAT (MISSING VALUE CODE IS -9999):

01-06 SOUID: Source identifier
08-15 DATE : Date YYYYMMDD
17-21 TX   : maximum temperature in 0.1 °C
23-27 Q_TX : Quality code for TX (0='valid'; 1='suspect'; 9='missing')

This is the blended series of station UNITED KINGDOM, ARMAGH (STAID: 271).
Blended and updated with sources: 100918 146805 
See file sources.txt and stations.txt for more info.

SOUID,    DATE,   TX, Q_TX
146805,18440101,   19,    0
146805,18440102,   -2,    0
146805,18440103,   67,    0
146805,18440104,  111,    0
146805,18440105,  117,    0
146805,18440106,   89,    0
146805,18440107,   61,    0
146805,18440108,   69,    0

#Expected:
SOUID,    DATE,   TX, Q_TX    Station
146805,18440101,   19,    0   ARMAGH
146805,18440102,   -2,    0   ARMAGH
146805,18440103,   67,    0   ARMAGH
146805,18440104,  111,    0   ARMAGH
146805,18440105,  117,    0   ARMAGH
146805,18440106,   89,    0   ARMAGH
146805,18440107,   61,    0   ARMAGH 
146805,18440108,   69,    0   ARMAGH

我可以使用以下方法选择文件列表:

files <- list.files(pattern = ".txt", full.names=TRUE)
all.txt <- lapply(files, data.table::fread)

但是,fread 删除了标题,所以我无法确定它们属于哪个站。

如果我有一个可用的站名列表并且可以匹配它们,我如何根据文本中的站创建一个新列?

更新:

我已设法将文本文件读入read_table,然后提取Kingdom 之后的电台名称,但是那些带有空格的名称,只有第一个单词被选中。鉴于电台名称位于 United Kingdom 之后的行尾,则选择 KINGDOM 之后的其余单词即可。

这是我目前尝试过的:

stringr::str_extract(xp1$xp, '(?<=KINGDOM\\s)\\w+')

如果我有例如,这会失败Cex et England,我只得到Cex

【问题讨论】:

  • 你的意思是txt文件的内容类似于This is only an example of the header to each text file blah blah blah Bu this station is called ARMAGH SOUID, DATE, TX, Q_TX 146805,18440101, 19, 0 146805,18440102, -2, 0 ……?我猜你可以用正则表达式提取关键字。
  • @PeaceWang 正则表达式一直是我的弱点,但现在是提高我技能的好时机
  • 如果你的文件在实际数据之前有这么多文本,fread 会报错吗?
  • @RonakShah fread 只是截断了内容,留下了数据,所以这绝对不是最好的选择。我正在尝试使用read_table 将文本文件捕获到一列中,并找出一些正则表达式(这是我的弱点)来提取UNITED KINGDOM 之后的电台名称,将其存储为向量,因为现在向量电台名称相对于列表按顺序排列,删除内容,然后将数据拆分到各自的列中,并使用 cbind 之类的名称添加新名称。这种方法对我来说有点牵强,而且实现起来相当长。

标签: r file filenames


【解决方案1】:

您可以使用正则表达式提取文件中.*UNITED KINGDOM, 之后出现的单词并将其用作站名。

library(data.table)

all.txt <- lapply(files, function(x) transform(fread(x), 
                 Station = sub('.*UNITED KINGDOM, (.*?)\\(.*', '\\1',
                           paste0(readLines(x), collapse = '\n'))))

【讨论】:

  • “ARMAGH”是其中一个文件中的站名,用于标识数据来自哪个站,但是每个文本文件都有一个唯一的站,因此“ARMAGH”仅属于一个文本文件。不幸的是,我不能使用这些文件名,因为它们是乱码。我有一个站点名称列表作为变量,但是我不太确定如何使用它来识别文本文件中的站点名称。每个文本文件都有一个唯一的站名,并且只出现一次
  • 这个问题是带有名称的向量是无序的,文本文件也是如此,因此它们会不匹配。除非他们是一种将文本内容中的站名与向量相匹配的方法?
  • 你提出了很好的问题,但我的问题没有让我的问题更清楚是我的错。我已经更新了上面的文本文件,请看一下。站名总是在文本“UNITED KINGDOM”之后
  • 这绝对是正确的方向!但是,请查看我在问题中更新的文本。我对这段代码有同样的问题!也许选择KINGDOM 之后和( 之前的所有单词?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-08
  • 2013-03-16
  • 2019-08-27
  • 2022-01-23
  • 1970-01-01
  • 2023-01-14
  • 2015-07-03
相关资源
最近更新 更多