我正在编写脚本以重新格式化数据,而我在使用正确的值/名称填充它时遇到了麻烦。
数据以:
开头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")
所以我现在要做的是使用formatdata
和ind
填写Treatname
第1列的剩余部分,并使用正确数量的治疗名称。
我目前所拥有的是一行如下:
formatdata1[ind[1]+1:((ind[2]-1)*ncol(data2[-1])),1]<-Treatname[1,1]
这确实填充了正确数量的单元格(所以我相信我的索引是正确的),但是,而不是我想要的处理名称(在这种情况下为Control
),它只填充1
如何让它使用名称而不是数字?我假设我可以添加到<-Treatname[1,1]
?
答案 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