【问题标题】:reshape unique strings in rows into columns in R将行中的唯一字符串重塑为 R 中的列
【发布时间】:2014-05-05 10:34:35
【问题描述】:

我想根据“Bull”列(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"),但不起作用。

【问题讨论】:

  • 你不能有一个函数有时返回一个输出,有时返回两个。您是否希望每次出现Bulls 时,它的列数与EBV 的值一样多,还是希望EBV 的值在列表中?
  • 一些EBV 出现在不同的Bulls 字符串中比其他字符串重复更多。这就是为什么我在某些列中的行数比其他列多的原因。我希望每次出现 Bulls 时只显示一列。

标签: r syntax reshape reshape2


【解决方案1】:

你有两个选择。索引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

【讨论】:

    【解决方案2】:

    只是为了确保基础 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-26
      • 2012-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-08
      • 2021-07-16
      相关资源
      最近更新 更多