R:没有标题的读取文件

时间:2015-03-11 14:57:03

标签: r read.table

有人向我发送了一个没有标题的.txt文件。此外,没有结构,因此所有行都跟在文件的同一行上的前一行。

我唯一知道的是每16个项目(由“,”分隔)在最终输出中应该有一行,因为每个绘图有16个变量或列。原始文件的每一行包含一天中438个不同图的16个变量的所有测量值。总的来说,原始文件包含4015行(天),我假设每行有438x16项(可能有NA)。

我设法将文件读作:

x <- readLines("Data/meteodata.dat")
x <- as.data.frame(matrix(as.numeric(unlist(strsplit(x, ","))), ncol = 16, byrow = TRUE))

但是,我现在需要通过绘图来聚合变量分组,因此我最终只有438行和16列包含每个变量和绘图的平均值,而不是如此庞大的数据集。问题是列不包含要分组的每个绘图的标识符。关键是这个混乱的数据集是由数据集(y)中的其他人生成的,其中包含438行(每个绘图一行),其中包含绘图标签,并且顺序相同:

> nrow(y)
[1] 438
> head(y)
  CODE_PLOT CODE_COUNTRY
1         1            1
2         1           12
3         1           14
4         1           15
5         1            5
6         1           50

因此,MESSY文件的每一行都与CODE_COUNTRY和CODE_PLOT在同一订单中对应。

感谢并抱歉这样一个抽象的信息。

能够阅读之前的文件示例:

48.25,4.25,1.989e+07,2.6,5.89,1.28,0.02,0,0,0.42,3575,0,-0.4,2.6,2.57,6.48,50,6,1.989e+07,3.55,5.42,2.31,0.42,0,0,0.15,2420,0,0.27,3.55,2,7.8

能够阅读后的数据集示例:

> head(test)
    lat  long     date temp.mean temp.max temp.min precip   E0  ES0  ET0 radiation snow.depth
1 48.25  4.25 19890000      2.60     5.89     1.28   0.02 0.00 0.00 0.42      3575       0.00
2    50     6 19890000      3.55     5.42     2.31   0.42 0.00 0.00 0.15      2420       0.00
3 47.75 16.25 19890000      0.67     3.98    -0.92   0.63 0.08 0.00 0.53      5061       0.02
4  69.5    29 19890000    -13.63   -10.06   -20.20   0.10 0.00 0.00 0.02        70      16.56
5 41.75  13.5 19890000      2.05     8.79    -1.72   0.00 0.20 0.06 0.54      8206       0.10
6    47  8.75 19890000     -4.29     2.62    -7.97   0.00 0.00 0.00 0.21      7403       5.45
  water.balance temp.mean2 wind P_hPa
1         -0.40       2.60 2.57  6.48
2          0.27       3.55 2.00  7.80
3          0.10       0.67 3.63  5.17
4          0.08     -13.63 3.65  1.78
5         -0.54       2.05 1.58  6.18
6         -0.21      -4.29 1.22  2.87

2 个答案:

答案 0 :(得分:0)

尝试将数据作为单个向量读取(可能使用readLinesscan),然后通过矩阵将其转换为data.frame:

# read in data
x <- "48.25,4.25,1.989e+07,2.6,5.89,1.28,0.02,0,0,0.42,3575,0,-0.4,2.6,2.57,6.48,50,6,1.989e+07,3.55,5.42,2.31,0.42,0,0,0.15,2420,0,0.27,3.55,2,7.8"

# convert to data.frame by organizing as a 2x16 matrix
as.data.frame(matrix(strsplit(x, ",")[[1]], ncol = 16, byrow = TRUE))
##      V1   V2        V3   V4   V5   V6   V7 V8 V9  V10  V11 V12  V13  V14  V15  V16
## 1 48.25 4.25 1.989e+07  2.6 5.89 1.28 0.02  0  0 0.42 3575   0 -0.4  2.6 2.57 6.48
## 2    50    6 1.989e+07 3.55 5.42 2.31 0.42  0  0 0.15 2420   0 0.27 3.55    2  7.8

您可能希望在强制转换为data.frame之前将数据转换为数字,否则您将从中获取因子变量:

as.data.frame(matrix(as.numeric(strsplit(x, ",")[[1]]), ncol = 16, byrow = TRUE))
##      V1   V2       V3   V4   V5   V6   V7 V8 V9  V10  V11 V12   V13  V14  V15  V16
## 1 48.25 4.25 19890000 2.60 5.89 1.28 0.02  0  0 0.42 3575   0 -0.40 2.60 2.57 6.48
## 2 50.00 6.00 19890000 3.55 5.42 2.31 0.42  0  0 0.15 2420   0  0.27 3.55 2.00 7.80

如果数据与您的icp data.frame一行一行完美匹配,则可以cbind将它们放在一起。

答案 1 :(得分:0)

  #messydata.txt : created by copying/pasting the line above into a textfile. 

   #Load Table into R
    data1 <- read.table("messydata.txt", header=FALSE,sep=",", nrows=2, col.names=paste0("C", 1:16) )
   #In col.names you can create the column names you want

       C1   C2       C3   C4   C5   C6   C7   C8 C9  C10  C11 C12   C13  C14  C15  C16
    1 48.25 4.25 19890000 2.60 5.89 1.28 0.02  0  0 0.42 3575   0 -0.40 2.60 2.57 6.48
    2 50.00 6.00 19890000 3.55 5.42 2.31 0.42  0  0 0.15 2420   0  0.27 3.55 2.00 7.80

   #Option 1- Bind your two tables
    cbind(data1, icp)
   #option 2- Join tables if you have a key Variable "ID" 
    require(plyr)
    newdata<- join(x=data1, y=icp, by = "ID")
#The ID can have a different name in x and y.