【问题标题】:R Populate specific vectors in a matrix with names from an indexR使用索引中的名称填充矩阵中的特定向量
【发布时间】:2016-02-28 23:35:02
【问题描述】:

我正在编写脚本来重新格式化数据,但我无法使用正确的值/名称填充它。

数据开头为:

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

所以我现在想做的是使用indTreatname 用正确数量的治疗名称填充formatdata 的第1 列的其余部分。

我目前拥有的是这样的一行:

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

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

如何让它使用名称而不是数字?我想我可以向&lt;-Treatname[1,1] 添加一些内容?

【问题讨论】:

  • 您似乎正试图取消透视原始数据表。我的假设是否正确?
  • @TimBiegeleisen 刚刚查看了 unpivot 的含义,是的,就是这样!
  • @TimBiegeleisen melt 是在这里使用的正确函数吗?我想这会为我节省大量的索引和手动填充矩阵。
  • 是的。现在发布一些东西。

标签: r matrix data-manipulation


【解决方案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

【讨论】:

  • 谢谢!原来我只需要知道一个函数已经存在!
【解决方案2】:

使用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

【讨论】:

    猜你喜欢
    • 2013-05-27
    • 2014-11-19
    • 2018-09-11
    • 1970-01-01
    • 2022-11-02
    • 1970-01-01
    • 1970-01-01
    • 2016-05-18
    • 2020-10-07
    相关资源
    最近更新 更多