R使用索引中的名称填充矩阵中的特定向量

时间:2015-11-26 01:05:47

标签: r matrix data-manipulation

我正在编写脚本以重新格式化数据,而我在使用正确的值/名称填充它时遇到了麻烦。

数据以:

开头
data1=

    Date         conc1   conc2   conc3
    Control      XXXX    XXXX    XXXX
    Control      XXXX    XXXX    XXXX
    Control      XXXX    XXXX    XXXX
    Treatment1   XXXX    XXXX    XXXX
    Treatment1   XXXX    XXXX    XXXX
    Treatment1   XXXX    XXXX    XXXX

并且最终需要

formatdata1=

    Treatment    conc    value
    Control      conc1   XXXX
    Control      conc1   XXXX
    Control      conc1   XXXX
    Control      conc2   XXXX
    Control      conc2   XXXX
    Control      conc2   XXXX
    Control      conc3   XXXX
    Control      conc3   XXXX
    Control      conc3   XXXX
    Treatment1   conc1   XXXX
    Treatment1   conc1   XXXX
    Treatment1   conc1   XXXX
    Treatment1   conc2   XXXX
    Treatment1   conc2   XXXX
    Treatment1   conc2   XXXX
    Treatment1   conc3   XXXX
    Treatment1   conc3   XXXX
    Treatment1   conc3   XXXX

目前我已预先分配了正确尺寸的矩阵:

formatdata1<-array(0,dim=c(nrow(data1[+1])*ncol(data1[-1])+1,3))

索引独特的治疗名称:

unik<-!duplicated(data2[,1])
ind<-seq_along(data2[,1])[unik]
Treatname<-data.frame(data2[,1][unik]) #extracted the unique names

用标题填充矩阵的第一行:

formatdata1[1,]=c("Treatment","Conc","Value")

所以我现在要做的是使用formatdataind填写Treatname第1列的剩余部分,并使用正确数量的治疗名称。

我目前所拥有的是一行如下:

formatdata1[ind[1]+1:((ind[2]-1)*ncol(data2[-1])),1]<-Treatname[1,1]

这确实填充了正确数量的单元格(所以我相信我的索引是正确的),但是,而不是我想要的处理名称(在这种情况下为Control),它只填充1

如何让它使用名称而不是数字?我假设我可以添加到<-Treatname[1,1]

2 个答案:

答案 0 :(得分:2)

使用属于melt() R包的reshape函数:

library(reshape)
data1 <- data.frame(Date=c("Control", "Control", "Control", "Treatment1", "Treatment1", "Treatment1"),
                    conc1=c(1,2,3,4,5,6),
                    conc2=c(2,4,6,8,10,12),
                    conc3=c(3,6,9,12,15,18))

data1.melt <- melt(data1, id = c("Date"))

> data1.melt[order(data1.melt$Date),]
        Date  variable value
1    Control     conc1     1
2    Control     conc1     2
3    Control     conc1     3
7    Control     conc2     2
8    Control     conc2     4
9    Control     conc2     6
13   Control     conc3     3
14   Control     conc3     6
15   Control     conc3     9
4  Treatment1    conc1     4
5  Treatment1    conc1     5
6  Treatment1    conc1     6
10 Treatment1    conc2     8
11 Treatment1    conc2    10
12 Treatment1    conc2    12
16 Treatment1    conc3    12
17 Treatment1    conc3    15
18 Treatment1    conc3    18

答案 1 :(得分:0)

使用dplyr/tidyr的另一个选项。我们gather来自广泛的&#39;长期&#39;格式,然后arrange基于&#39;日期&#39;,&#39; conc&#39;列的行。

library(dplyr)
library(tidyr)
gather(data1, conc, value, -Date) %>% 
                  arrange(Date, conc)
#           Date  conc value
#1     Control conc1     1
#2     Control conc1     2
#3     Control conc1     3
#4     Control conc2     2
#5     Control conc2     4
#6     Control conc2     6
#7     Control conc3     3
#8     Control conc3     6
#9     Control conc3     9
#10 Treatment1 conc1     4
#11 Treatment1 conc1     5
#12 Treatment1 conc1     6
#13 Treatment1 conc2     8
#14 Treatment1 conc2    10
#15 Treatment1 conc2    12
#16 Treatment1 conc3    12
#17 Treatment1 conc3    15
#18 Treatment1 conc3    18