可以使用我的r包onetree,上传到我的github yikeshu0611。
install.packages("devtools") #if you didnot have devtools packages in r
library(devtools)
install_github("yikeshu0611/onetree") #install onetree package from github
1。循序渐进
首先,我将逐步教你如何将宽转换为长。
library(onetree)
long1=reshape_toLong(data=df1,
id= "ID",
j="newcolumn",
value.var.prefix=c("M1a","M2a","M1r","M2r")
在此命令中,j 是新列的名称。
你会得到下面的结果long1
long1
ID Group newcolumn M1a M2a M1r M2r
1 1 2hB 0.2 0.3 200 300
1 1 3hB 0.4 0.6 400 600
2 1 2hB 0.3 0.4 300 400
2 1 3hB 0.6 0.6 600 600
进一步,我们可以在数据中看到long1,M1a,M2a-------,M1r,M2r-----。该数据仍然是一个宽数据。我们仍然可以将其转换为 long。我们使用 M1、M2 作为前缀。 a 和 r 作为新列,这是测试方式。命令如下。
long2=reshape_toLong(data = long1,
id = c("ID","newcolumn"),
j = "testway",
value.var.prefix = c("M1","M2"))
long2
ID newcolumn Group testway M1 M2
1 1 2hB 1 a 0.2 0.3
2 1 2hB 1 r 200.0 300.0
3 1 3hB 1 a 0.4 0.6
4 1 3hB 1 r 400.0 600.0
5 2 2hB 1 a 0.3 0.4
6 2 2hB 1 r 300.0 400.0
7 2 3hB 1 a 0.6 0.6
8 2 3hB 1 r 600.0 600.0
这里,我们使用两个变量 ID 和 newcolumn 作为 id 对象。因为在长数据中,id被视为唯一变量,如果我们只使用id,就会发生不匹配的情况。您也可以创建一个新的 id,例如:idnew。
long1$idnew = 1:nrow(long1)
reshape_toLong(data = long1,
id = "idnew",
j = "testway",
value.var.prefix = c("M1","M2"))
我们继续吧!在数据long2中,可能有M1,M2,--------。所以long2仍然是一个宽数据。是的,我们可以改变的是长数据。 M 作为前缀,1,2,3,-----作为新列。但是,id 应该是 ID、newcolumn 和 testway,或者你可以为 long2 创建一个新的 id,这将确保 id 唯一。
long3=reshape_toLong(data = long2,
id = c("ID","newcolumn","testway"),
j = "testnumber",
value.var.prefix = "M")
long3
ID newcolumn testway Group testnumber M
1 1 2hB a 1 1 0.2
2 1 2hB a 1 2 0.3
3 1 2hB r 1 1 200.0
4 1 2hB r 1 2 300.0
5 1 3hB a 1 1 0.4
6 1 3hB a 1 2 0.6
7 1 3hB r 1 1 400.0
8 1 3hB r 1 2 600.0
9 2 2hB a 1 1 0.3
10 2 2hB a 1 2 0.4
11 2 2hB r 1 1 300.0
12 2 2hB r 1 2 400.0
13 2 3hB a 1 1 0.6
14 2 3hB a 1 2 0.6
15 2 3hB r 1 1 600.0
16 2 3hB r 1 2 600.0
现在,数据 long3 是绝对长数据。
前缀很重要,我们使用如下前缀
- 首先:M1a、M2a、M1r、M2r
- 秒:M1,M2
- 第三个:M
我们将 id 更改 3 次,以使其唯一
- 第一:ID
- 秒:ID,新列
- 第三个:ID、新列、测试通道
j 是新列
2。快一点
如果每个测量结果有 4 个结果:a2、a3、r2 r3。 a:绝对值,r:相对值,2:时间 2,3:时间 3。然后 1100 列有 275 个测量结果(1100/4)。所以,我们有 M1a2hB、M2a2hB、M3a2hB------M275a2hB。而M1a3hB,M2a3hB,M3a3hB------M275a3hB,M3就是这样。如果我们使用这样的命令,我们将有一个很长的 value.var.prefix。
但是,我们可以使用更快的方式通过 paste0 函数构造前缀。
ma2=paste0("M",1:275,"a")
ma3=paste0("M",1:275,"a")
mr2=paste0("M",1:275,"r")
mr3=paste0("M",1:275,"r")
m=c(ma2,ma3,mr2,mr3)
在df1中,我们只有2个测量结果,所以我们可以使用下面的命令
ma2=paste0("M",1:2,"a")
ma3=paste0("M",1:2,"a")
mr2=paste0("M",1:2,"r")
mr3=paste0("M",1:2,"r")
prefix=c(ma2,ma3,mr2,mr3)
reshape_toLong(data = df1,
id = "ID",
j = "newcolumn",
value.var.prefix = prefix)
ID Group newcolumn M1a M2a M1r M2r
1 1 1 2hB 0.2 0.3 200 300
2 1 1 3hB 0.4 0.6 400 600
3 2 1 2hB 0.3 0.4 300 400
4 2 1 3hB 0.6 0.6 600 600
仍然可以使用 M1, M2----- 作为前缀,我们将 a2hB, a3hB, r2hB, r3hB 更改为新列。然后我们将新列子串到不同的列。
m1=paste0("M",1:2)
m2=paste0("M",1:2)
prefix=c(m1,m2)
long4=reshape_toLong(data = df1,
id = "ID",
j = "newcolumn",
value.var.prefix = prefix)
long4
ID Group newcolumn M1 M2
1 1 1 a2hB 0.2 0.3
2 1 1 a3hB 0.4 0.6
3 1 1 r2hB 200.0 300.0
4 1 1 r3hB 400.0 600.0
5 2 1 a2hB 0.3 0.4
6 2 1 a3hB 0.6 0.6
7 2 1 r2hB 300.0 400.0
8 2 1 r3hB 600.0 600.0
long4$testway=Left(long4$newcolumn,1)
long4$time=Right(long4$newcolumn,3)
long4
ID Group newcolumn M1 M2 testway time
1 1 1 a2hB 0.2 0.3 a 2hB
2 1 1 a3hB 0.4 0.6 a 3hB
3 1 1 r2hB 200.0 300.0 r 2hB
4 1 1 r3hB 400.0 600.0 r 3hB
5 2 1 a2hB 0.3 0.4 a 2hB
6 2 1 a3hB 0.6 0.6 a 3hB
7 2 1 r2hB 300.0 400.0 r 2hB
8 2 1 r3hB 600.0 600.0 r 3hB
最后,我们只能使用 M 作为前缀,来获取绝对数据。
long5=reshape_toLong(data = df1,
id = "ID",
j = "newcolumn",
value.var.prefix = "M")
long5
ID Group newcolumn M
1 1 1 1a2hB 0.2
2 1 1 1a3hB 0.4
3 1 1 2a2hB 0.3
4 1 1 2a3hB 0.6
5 1 1 1r2hB 200.0
6 1 1 1r3hB 400.0
7 1 1 2r2hB 300.0
8 1 1 2r3hB 600.0
9 2 1 1a2hB 0.3
10 2 1 1a3hB 0.6
11 2 1 2a2hB 0.4
12 2 1 2a3hB 0.6
13 2 1 1r2hB 300.0
14 2 1 1r3hB 600.0
15 2 1 2r2hB 400.0
16 2 1 2r3hB 600.0
然后我们可以使用 onetree 包中的 Left、Mid 和 Right 函数从左、中、右子串得到新的列。
long5$testnumber=Left(long5$newcolumn,1)
long5$testway=Mid(long5$newcolumn,2,1)
long5$time=Right(long5$newcolumn,3)
long5
ID Group newcolumn M testnumber testway time
1 1 1 1a2hB 0.2 1 a 2hB
2 1 1 1a3hB 0.4 1 a 3hB
3 1 1 2a2hB 0.3 2 a 2hB
4 1 1 2a3hB 0.6 2 a 3hB
5 1 1 1r2hB 200.0 1 r 2hB
6 1 1 1r3hB 400.0 1 r 3hB
7 1 1 2r2hB 300.0 2 r 2hB
8 1 1 2r3hB 600.0 2 r 3hB
9 2 1 1a2hB 0.3 1 a 2hB
10 2 1 1a3hB 0.6 1 a 3hB
11 2 1 2a2hB 0.4 2 a 2hB
12 2 1 2a3hB 0.6 2 a 3hB
13 2 1 1r2hB 300.0 1 r 2hB
14 2 1 1r3hB 600.0 1 r 3hB
15 2 1 2r2hB 400.0 2 r 2hB
16 2 1 2r3hB 600.0 2 r 3hB
这里,我们使用不同的前缀来获取不同的数据。
- 第一:使用paste0函数构造
- 秒:M1、M2、M3-------,仍然是paste0功能但更简单
- 第三:我们只使用M
- 我们没有改变 id 和 j
3。结论
在 reshape_toLong 函数中:
- data:是您要转换的数据
- id:是唯一的 id变量,可以是一个或多个变量
- j: 是新变量name,你要堆叠时间或序号
- value.var.prefix:是值变量的前缀