将行中的唯一字符串重新整形为R中的列

时间:2014-05-05 10:34:35

标签: r syntax reshape reshape2

我想基于“公牛”专栏(all数据框)中的唯一字符串重构我的数据:

EBV       Bulls
0.13    NE001362
0.17    NE001361
0.05    NE001378
-0.12   NE001359
-0.14   NE001379
0.13    NE001380
-0.46   NE001379
-0.46   NE001359
-0.68   NE001394
0.28    NE001391
0.84    NE001394
-0.43   NE001393
-0.18   NE001707

我的预期输出:

NE001362    NE001361    NE001378    NE001359    NE001379    NE001380    NE001394    NE001391    NE001393    NE001707
  0.13        0.17        0.05       -0.12       -0.14        0.13       -0.68        0.28       -0.43       -0.18
                                     -0.46       -0.46                    0.84          

我试过了dat2 <- dcast(all, EBV~variable, value.var = "Bulls")但是没有用。

2 个答案:

答案 0 :(得分:3)

您有两种选择。为Bulls的每个级别索引多个匹配项,或使用列表保存不同级别的EBV

选项1:索引多次出现

您可以使用data.table生成一个索引,该索引对多次出现的EBV进行编号:

require(data.table)
setDT(all)                    ## convert to data.table
all[, index:=1:.N, by=Bulls]  ## generate index
dcast.data.table(all, formula=index ~ Bulls, value.var='EBV') 

选项2:使用列表存储多个值

您可以将列表用作data.table的值(我不确定普通data.frame是否支持它)。

require(data.table)
setDT(all)                       ## convert to data.table
all[, list(list(EBV)), by=Bulls] ## multiple values stored as list

答案 1 :(得分:1)

只是为了确保基地R获得一些确认:

## Add an ID, like ilir did, but with base R functions
mydf$ID <- with(mydf, ave(rep(1, nrow(mydf)), Bulls, FUN = seq_along))

此处reshape

reshape(mydf, direction = "wide", idvar="ID", timevar="Bulls")
#   ID EBV.NE001362 EBV.NE001361 EBV.NE001378 EBV.NE001359 EBV.NE001379
# 1  1         0.13         0.17         0.05        -0.12        -0.14
# 7  2           NA           NA           NA        -0.46        -0.46
#   EBV.NE001380 EBV.NE001394 EBV.NE001391 EBV.NE001393 EBV.NE001707
# 1         0.13        -0.68         0.28        -0.43        -0.18
# 7           NA         0.84           NA           NA           NA

xtabs。注意:这是一个类似于matrix的表格,因此如果您需要data.frame,则必须在输出中使用as.data.frame.matrix

xtabs(EBV ~ ID + Bulls, mydf)
#    Bulls
# ID  NE001359 NE001361 NE001362 NE001378 NE001379 NE001380 NE001391
#   1    -0.12     0.17     0.13     0.05    -0.14     0.13     0.28
#   2    -0.46     0.00     0.00     0.00    -0.46     0.00     0.00
#    Bulls
# ID  NE001393 NE001394 NE001707
#   1    -0.43    -0.68    -0.18
#   2     0.00     0.84     0.00