【问题标题】:reshape matrix - multiple columns in one column重塑矩阵 - 一列中的多列
【发布时间】:2012-05-02 16:32:05
【问题描述】:

我有一个如下所示的矩阵:

SNP     G1      G2      G3
marker1 TT      CC      TT
marker2 AA      AA      AA
marker3 TT      TT      TT 

我希望它看起来像这样:

SNP     
>marker1    TT  G1
>marker2    AA  G1
>marker3    TT  G1
>marker1    CC  G2
>marker2    AA  G2
>marker3    TT  G2
>marker1    TT  G3
>marker2    AA  G3
>marker3    TT  G3

我正在使用这个:

        bsp2<- read.table("C:/R/bsp2.csv", header=TRUE) 

       reshape(as.data.frame(bsp2), direction="long", varying = list(colnames(bsp2)
       [2:6]), v.names="G", idvar="SNP")

但我收到错误消息“选择了未定义的列”。 谁能告诉我我做错了什么?

【问题讨论】:

  • bsp2 只有 4 列,所以 colnames(bsp2)[2:6] 生成 "G1" "G2" "G3" NA NA,进而导致错误。
  • 类似问题here。未来的搜索者也可能对反向感兴趣;见this question

标签: r matrix reshape


【解决方案1】:

使用 reshape2 中的melt 会更容易:

dat <- read.table(text = "SNP     G1      G2      G3
marker1 TT      CC      TT
marker2 AA      AA      AA
marker3 TT      TT      TT",header = T,sep = "")

require(reshape2)
melt(dat,id.var = "SNP")

      SNP variable value
1 marker1       G1    TT
2 marker2       G1    AA
3 marker3       G1    TT
4 marker1       G2    CC
5 marker2       G2    AA
6 marker3       G2    TT
7 marker1       G3    TT
8 marker2       G3    AA
9 marker3       G3    TT

【讨论】:

    【解决方案2】:

    虽然 joran 是正确的,但它在底座上进行了重塑,可能会更容易。

    bsp2 <- read.table(text="SNP     G1      G2      G3
    marker1 TT      CC      TT
    marker2 AA      AA      AA
    marker3 TT      TT      TT ", header=TRUE)
    
    bsp2.long <- reshape(bsp2, direction="long", varying = 2:4, v.names="G", 
        timevar="TIME", times=paste0("G", 1:3), idvar="SNP")
    
    rownames(bsp2.long) <- seq_len(nrow(bsp2.long))
    bsp2.long
    

    产量:

          SNP TIME  G
    1 marker1   G1 TT
    2 marker2   G1 AA
    3 marker3   G1 TT
    4 marker1   G2 CC
    5 marker2   G2 AA
    6 marker3   G2 TT
    7 marker1   G3 TT
    8 marker2   G3 AA
    9 marker3   G3 TT
    

    请注意,您需要 R 2,15 才能正常工作,因为我使用了 paste0。如果您没有 R2.15 并且不想安装它,请将该参数替换为 times=c("G1", "G2", "G3")。此外,我称之为 TIME 的名称也不是必需的,因为 R 会称之为 time,但我这样做是为了表明您可以使用 reshape 控制该名称。

    【讨论】:

    • +1 提醒我为什么我从来没有费心真正学习如何使用reshape。呃。
    猜你喜欢
    • 2013-05-17
    • 2021-10-05
    • 2014-07-11
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 2021-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多