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")
所以我现在想做的是使用 ind
和 Treatname
将 formatdata
的第 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
我正在编写重新格式化数据的脚本,但在使用正确的 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")
所以我现在想做的是使用 ind
和 Treatname
将 formatdata
的第 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