如何使用datatable将矩阵文本文件读入r中

时间:2016-02-28 20:13:18

标签: r read.table

我无法读取具有矩阵格式数据格式的文本文件,如下所示:

Location Product Day1 Day2 Day3 Day4 ... Day1 Day2 Day3
                 Jan  Jan  Jan       ... Feb  Feb  Feb
123      23                 8             9    3
234      25       2    4                            9 
254      87       3
213      56            7                  5

它本质上是一个时间序列,每天按位置包含大量产品。我想最终把它转换为" sql"表格式。

我遇到的麻烦是,当我尝试以下操作时,只需跳过第2行并使用fill = TRUE导入其余数据,我就无法获得所需的结果。实际的计数会向右移动,并且不会与第一个"标题对齐。行。我想将第1行和第2行组合在一起,以便从第1行的第1天开始生成日期字段,然后将空字段保留为空或NA。然后最终将此数据转换为以下格式:

Location Product Period Count
123      23      Jan 1    
234      25      Jan 1    5
234      25      Feb 3    9

我该如何做到这一点?

1 个答案:

答案 0 :(得分:0)

这演示了pkg:fwf_empty的自动位置猜测函数readr。我无法使read_fwf - 函数接受file参数的文本连接参数,因此需要将文本保存为略微编辑的版本,如下所示:

Location Product Day1 Day2 Day3 Day4     Day1 Day2 Day3
                 Jan  Jan  Jan  Jan      Feb  Feb  Feb
123      23                 8             9    3
234      25       2    4                            9 
254      87       3
213      56            7                  5

R代码:

 require(readr)
fwf_empty(file="~/Untitled 4 copy.txt")
$begin
[1]  0  9 17 22 27 32 40

$end
[1]  8 16 21 26 31 36 55

$col_names
[1] "X1" "X2" "X3" "X4" "X5" "X6" "X7"

> read_fwf(file="~/Untitled 4 copy.txt", fwf_empty(file="~/Untitled 4 copy.txt"))
Warning: 8 parsing failures.
row col  expected    actual
  2  X9 4 chars   3        
  3  X8 4 chars   2        
  3  -- 9 columns 8 columns
  4  X9 4 chars   3        
  5  X3 4 chars   2        
... ... ......... .........
.See problems(...) for more details.
        X1      X2   X3   X4   X5   X6   X7   X8   X9
1 Location Product Day1 Day2 Day3 Day4 Day1 Day2 Day3
2     <NA>    <NA>  Jan  Jan  Jan  Jan  Feb  Feb  Feb
3      123      23 <NA> <NA>    8 <NA>    9    3 <NA>
4      234      25    2    4 <NA> <NA> <NA> <NA>    9
5      254      87    3 <NA> <NA> <NA> <NA> <NA> <NA>
6      213      56 <NA>    7 <NA> <NA>    5 <NA> <NA>

然后重命名列并删除前两行:

> colnm <- paste0( inp[1,], inp[2,])
> colnm
[1] "LocationNA" "ProductNA"  "Day1Jan"    "Day2Jan"    "Day3Jan"   
[6] "Day4Jan"    "Day1Feb"    "Day2Feb"    "Day3Feb"   
> colnames(inp) <- colnm
> inp[-(1:2), ]
  LocationNA ProductNA Day1Jan Day2Jan Day3Jan Day4Jan Day1Feb Day2Feb
3        123        23    <NA>    <NA>       8    <NA>       9       3
4        234        25       2       4    <NA>    <NA>    <NA>    <NA>
5        254        87       3    <NA>    <NA>    <NA>    <NA>    <NA>
6        213        56    <NA>       7    <NA>    <NA>       5    <NA>
  Day3Feb
3    <NA>
4       9
5    <NA>
6    <NA>