2013-11-06 5 views
0

Я имею дело с оборванным файловым кадром, который содержит столбец временных точек в первом столбце, список серийных номеров в первой строке и фактические данные инвентаризации (количество элементов) в остальная часть кадра данных.извлекающие факторы из строки в кадре данных

> mydf 
    V1    V2    V3    V4    V5 
1 month item_serial123 item_serial234 item_serial345 item_serial456 
2  0   234   120   302   500 
3  1   344   125   350   450 
4  2   235   129   400   300 
5  3   453   145   450   330 
6  4   200   130   500   200 
7  5   201       501    
8  6           504   202 

Я пытаюсь форматировать данные таким образом, что у меня есть «длинный» список таким образом, что я могу запустить анализ на серийный номер каждого элемента. Я могу отказаться от нечисловых данных из моего списка и убедитесь, что данные импортируются в виде символьных объектов, установив stringsAsFactors=FALSE флаг в read.table, то преобразование mydf в матрицу данных:

> mydf.new<-data.matrix(mydf) 
Warning in data.matrix(mydf) : NAs introduced by coercion 
Warning in data.matrix(mydf) : NAs introduced by coercion 
Warning in data.matrix(mydf) : NAs introduced by coercion 
Warning in data.matrix(mydf) : NAs introduced by coercion 
Warning in data.matrix(mydf) : NAs introduced by coercion 
> mydf.new 
    V1 V2 V3 V4 V5 
[1,] NA NA NA NA NA 
[2,] 0 234 120 302 500 
[3,] 1 344 125 350 450 
[4,] 2 235 129 400 300 
[5,] 3 453 145 450 330 
[6,] 4 200 130 500 200 
[7,] 5 201 NA 501 NA 
[8,] 6 NA NA 504 202 

Изменение переменной V1 на «время» тривиально. То, с чем я действительно борюсь, состоит в том, как извлечь серийные номера от mydf[1,2:5] и присвоить их соответствующим данным, когда я расплав/литье mydf.new. Я бы хотел, чтобы это произошло:

time count serial_number 
    0 234 item_serial123 
    1 344 item_serial123 
    2 235 item_serial123 
    3 453 item_serial123 
    4 200 item_serial123 
    5 201 item_serial123 
    6 NA item_serial123 

и т. Д. Есть ли какие-либо предложения?

+2

вам нужно использовать ' header = TRUE' при чтении данных с 'read.table' для R, чтобы понять, что первая строка соответствует именам colnames, тогда вы можете применить' data.matrix (mydf) 'без предупреждений –

ответ

0

Если я правильно понял ваш вопрос, то у вас есть data.frame вроде этого:

> df 
    month item_serial123 item_serial234 item_serial345 item_serial456 
1  0   234   120   302   500 
2  1   344   125   350   450 
3  2   235   129   400   300 
4  3   453   145   450   330 
5  4   200   130   500   200 
6  5   201    NA   501    NA 
7  6    NA    NA   504   202 

теперь вы можете использовать reshape, чтобы получить следующее:

> df_new <- reshape(df, idvar = "month", varying = list(2:5), 
        v.names="item_serial", direction = "long", 
        new.row.names=1:(prod(dim(df[,-1])))) 
> df_new$time <- factor(df_new$time, labels=names(df)[-1]) 
> df_new 
    month   time item_serial # you may want to use `colnames`to chance them 
1  0 item_serial123   234 
2  1 item_serial123   344 
3  2 item_serial123   235 
4  3 item_serial123   453 
5  4 item_serial123   200 
6  5 item_serial123   201 
7  6 item_serial123   NA 
8  0 item_serial234   120 
Смежные вопросы