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

R Populate specific vectors in a matrix with names from an index

我正在编写重新格式化数据的脚本,但在使用正确的 values/names.

填充它时遇到问题

数据开头为:

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

目前我有 pre-allocated 一个正确维度的矩阵:

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")

所以我现在想做的是使用 indTreatnameformatdata 的第 1 列的剩余部分填入正确数量的治疗名称。

我现在有这样一行:

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

这确实填充了正确数量的单元格(所以我相信我的索引是正确的),但是,而不是我想要的治疗名称(在本例中 Control)它只填充了 1.

如何让它使用姓名而不是号码?我想我可以添加一些东西到 <-Treatname[1,1]?

使用 melt() 函数,它是 reshape R 包的一部分:

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

使用 dplyr/tidyr 的另一个选项。我们 gather 从 'wide' 到 'long' 格式,然后 arrange 基于 'Date'、'conc'、列的行。

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