从数据帧中的行中提取因子

时间:2013-11-06 23:34:13

标签: r reshape

我正在处理一个参差不齐的数据框,其中包含第一列中的一列时间点,第一行中的序列号列表以及数据帧其余部分中的实际库存数据(项目数)。

> 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

等。等任何建议?

1 个答案:

答案 0 :(得分: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