2015-03-11 2 views
0

Кто-то отправил мне .txt-файл, который не имеет заголовка. Кроме того, нет структуры, поэтому все строки следуют за предыдущей в той же строке файла.R: Прочитать файл без заголовка

Единственное, что я знаю, это то, что каждые 16 элементов (разделенных символом «,») должны иметь одну строку в конечном результате, потому что для каждого графика имеется 16 переменных или столбцов. Каждая строка необработанного файла содержит все измерения для 16 переменных для 438 разных графиков за один день. В общем случае необработанный файл содержит 4015 строк (дней), из которых 438x16 единиц в каждой строке я предполагаю (могут быть НС).

мне удалось прочитать файл как:

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

Однако, теперь я должен был бы агрегировать переменные группировки по сюжету, так что вместо такого огромного набора данных, я в конечном итоге только 438 строк и 16 столбцы, содержащие средние значения для каждой переменной и графика. Проблема заключается в том, что столбцы не содержат идентификатора для каждого заглавного поля. Ключ в том, что этот грязный набор данных был создан кем-то другим из набора данных (у) с 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 FILE CODE_COUNTRY И CODE_PLOT «Y» В ОДНОМ ЗАКАЗЕ.

Спасибо и простите за такое абстрактное сообщение.

Пример файла прежде чем он сможет прочитать:

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 
+0

Вам нужно будет вручную определить, какая строка этих данных принадлежит какому сюжету. Затем вы можете «агрегировать» и использовать «cbind» или «merge» для объединения с другими данными. – Thomas

+0

У меня 438 сюжетов, вся идея этого - автоматизация процесса. Я думаю, что ключ состоит в том, что каждая строка файла соответствует 438 графикам в том же порядке, что и в другом наборе данных, который я хочу связать с этим, и содержит метки графиков. Возможно, если бы я мог составить список для каждой строки файла и cbind эту строку с чистым набором данных ... –

ответ

0

Попробуйте просто читать данные в виде одного вектора (возможно использовать readLines или scan), а затем преобразовать его в 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 .frame, вы можете просто cbind их вместе.

+0

'> x <- as.data.frame (matrix (strsplit (x,", ") [[1] ], ncol = 16, byrow = TRUE)) Ошибка в strsplit (x, ","): несимвольный аргумент' –

+0

Я должен был указать в своем предыдущем комментарии, что я рад файл следующим образом: 'x <- read .table ("Data/meteodata.dat") ' –

+0

@fede_luppi Кажется, вы предположили, что файл представляет собой всего лишь одну строку текста. Если это так, прочитайте его как: 'x <- readLines (" file.txt ")' где "file.txt" - это имя файла. – Thomas

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. 
+0

Просьба показать результат этого. – Thomas

+0

Я не мог человек возраст, чтобы заставить его работать –

+0

Ищите для загрузки .dat файлы: http://stackoverflow.com/questions/11664075/import-dat-file-into-r –

Смежные вопросы