我的数据如下:
> zerbedata
group id time measurements
1.1.1 1 1 0.0 4.3
2.1.1 1 2 0.0 3.7
3.1.1 1 3 0.0 4.0
4.1.1 1 4 0.0 3.6
5.1.1 1 5 0.0 4.1
6.1.1 1 6 0.0 3.8
7.1.1 1 7 0.0 3.8
8.1.1 1 8 0.0 4.4
9.1.1 1 9 0.0 5.0
10.1.1 1 10 0.0 3.7
11.1.1 1 11 0.0 3.7
12.1.1 1 12 0.0 4.4
13.1.1 1 13 0.0 4.7
14.2.1 2 14 0.0 4.3
15.2.1 2 15 0.0 5.0
16.2.1 2 16 0.0 4.6
17.2.1 2 17 0.0 4.3
18.2.1 2 18 0.0 3.1
19.2.1 2 19 0.0 4.8
20.2.1 2 20 0.0 3.7
21.2.1 2 21 0.0 5.4
22.2.1 2 22 0.0 3.0
23.2.1 2 23 0.0 4.9
24.2.1 2 24 0.0 4.8
25.2.1 2 25 0.0 4.4
26.2.1 2 26 0.0 4.9
27.2.1 2 27 0.0 5.1
28.2.1 2 28 0.0 4.8
29.2.1 2 29 0.0 4.2
30.2.1 2 30 0.0 6.6
31.2.1 2 31 0.0 3.6
32.2.1 2 32 0.0 4.5
33.2.1 2 33 0.0 4.6
1.1.2 1 1 0.5 3.3
2.1.2 1 2 0.5 2.6
3.1.2 1 3 0.5 4.1
4.1.2 1 4 0.5 3.0
5.1.2 1 5 0.5 3.8
6.1.2 1 6 0.5 2.2
7.1.2 1 7 0.5 3.0
8.1.2 1 8 0.5 3.9
9.1.2 1 9 0.5 4.0
10.1.2 1 10 0.5 3.1
11.1.2 1 11 0.5 2.6
12.1.2 1 12 0.5 3.7
13.1.2 1 13 0.5 3.1
14.2.2 2 14 0.5 3.3
15.2.2 2 15 0.5 4.9
16.2.2 2 16 0.5 4.4
17.2.2 2 17 0.5 3.9
18.2.2 2 18 0.5 3.1
19.2.2 2 19 0.5 5.0
20.2.2 2 20 0.5 3.1
21.2.2 2 21 0.5 4.7
22.2.2 2 22 0.5 2.5
23.2.2 2 23 0.5 5.0
24.2.2 2 24 0.5 4.3
25.2.2 2 25 0.5 4.2
26.2.2 2 26 0.5 4.3
27.2.2 2 27 0.5 4.1
28.2.2 2 28 0.5 4.6
29.2.2 2 29 0.5 3.5
30.2.2 2 30 0.5 6.1
31.2.2 2 31 0.5 3.4
32.2.2 2 32 0.5 4.0
33.2.2 2 33 0.5 4.4
1.1.3 1 1 1.0 3.0
2.1.3 1 2 1.0 2.6
3.1.3 1 3 1.0 3.1
4.1.3 1 4 1.0 2.2
5.1.3 1 5 1.0 2.1
6.1.3 1 6 1.0 2.0
7.1.3 1 7 1.0 2.4
8.1.3 1 8 1.0 2.8
9.1.3 1 9 1.0 3.4
10.1.3 1 10 1.0 2.9
11.1.3 1 11 1.0 2.6
12.1.3 1 12 1.0 3.1
13.1.3 1 13 1.0 3.2
14.2.3 2 14 1.0 3.0
15.2.3 2 15 1.0 4.1
16.2.3 2 16 1.0 3.9
17.2.3 2 17 1.0 3.1
18.2.3 2 18 1.0 3.3
19.2.3 2 19 1.0 2.9
20.2.3 2 20 1.0 3.3
21.2.3 2 21 1.0 3.9
22.2.3 2 22 1.0 2.3
23.2.3 2 23 1.0 4.1
24.2.3 2 24 1.0 4.7
25.2.3 2 25 1.0 4.2
26.2.3 2 26 1.0 4.0
27.2.3 2 27 1.0 4.6
28.2.3 2 28 1.0 4.6
29.2.3 2 29 1.0 3.8
30.2.3 2 30 1.0 5.2
31.2.3 2 31 1.0 3.1
32.2.3 2 32 1.0 3.7
33.2.3 2 33 1.0 3.8
1.1.4 1 1 1.5 2.6
2.1.4 1 2 1.5 1.9
3.1.4 1 3 1.5 2.3
4.1.4 1 4 1.5 2.8
5.1.4 1 5 1.5 3.0
6.1.4 1 6 1.5 2.6
7.1.4 1 7 1.5 2.5
8.1.4 1 8 1.5 2.1
9.1.4 1 9 1.5 3.4
10.1.4 1 10 1.5 2.2
11.1.4 1 11 1.5 2.3
12.1.4 1 12 1.5 3.2
13.1.4 1 13 1.5 3.3
14.2.4 2 14 1.5 2.6
15.2.4 2 15 1.5 3.7
16.2.4 2 16 1.5 3.9
17.2.4 2 17 1.5 3.1
18.2.4 2 18 1.5 2.6
19.2.4 2 19 1.5 2.8
20.2.4 2 20 1.5 2.8
21.2.4 2 21 1.5 4.1
22.2.4 2 22 1.5 2.2
23.2.4 2 23 1.5 3.7
24.2.4 2 24 1.5 4.6
25.2.4 2 25 1.5 3.4
26.2.4 2 26 1.5 4.0
27.2.4 2 27 1.5 4.1
28.2.4 2 28 1.5 4.4
29.2.4 2 29 1.5 3.6
30.2.4 2 30 1.5 4.1
31.2.4 2 31 1.5 2.8
32.2.4 2 32 1.5 3.3
33.2.4 2 33 1.5 3.8
1.1.5 1 1 2.0 2.2
2.1.5 1 2 2.0 2.9
3.1.5 1 3 2.0 2.9
4.1.5 1 4 2.0 2.9
5.1.5 1 5 2.0 3.6
6.1.5 1 6 2.0 3.8
7.1.5 1 7 2.0 3.1
8.1.5 1 8 2.0 3.6
9.1.5 1 9 2.0 3.3
10.1.5 1 10 2.0 1.5
11.1.5 1 11 2.0 2.9
12.1.5 1 12 2.0 3.7
13.1.5 1 13 2.0 3.2
14.2.5 2 14 2.0 2.2
15.2.5 2 15 2.0 3.7
16.2.5 2 16 2.0 3.7
17.2.5 2 17 2.0 3.1
18.2.5 2 18 2.0 2.6
19.2.5 2 19 2.0 2.2
20.2.5 2 20 2.0 2.9
21.2.5 2 21 2.0 2.8
22.2.5 2 22 2.0 2.1
23.2.5 2 23 2.0 3.7
24.2.5 2 24 2.0 4.7
25.2.5 2 25 2.0 3.5
26.2.5 2 26 2.0 3.3
27.2.5 2 27 2.0 3.4
28.2.5 2 28 2.0 4.1
29.2.5 2 29 2.0 3.3
30.2.5 2 30 2.0 4.3
31.2.5 2 31 2.0 2.1
32.2.5 2 32 2.0 2.4
33.2.5 2 33 2.0 3.8
1.1.6 1 1 3.0 2.5
2.1.6 1 2 3.0 3.2
3.1.6 1 3 3.0 3.1
4.1.6 1 4 3.0 3.9
5.1.6 1 5 3.0 3.4
6.1.6 1 6 3.0 3.6
7.1.6 1 7 3.0 3.4
8.1.6 1 8 3.0 3.8
9.1.6 1 9 3.0 3.6
10.1.6 1 10 3.0 2.3
11.1.6 1 11 3.0 2.2
12.1.6 1 12 3.0 4.3
13.1.6 1 13 3.0 4.2
14.2.6 2 14 3.0 2.5
15.2.6 2 15 3.0 4.1
16.2.6 2 16 3.0 4.2
17.2.6 2 17 3.0 3.1
18.2.6 2 18 3.0 1.9
19.2.6 2 19 3.0 3.1
20.2.6 2 20 3.0 3.6
21.2.6 2 21 3.0 3.7
22.2.6 2 22 3.0 2.6
23.2.6 2 23 3.0 4.1
24.2.6 2 24 3.0 3.7
25.2.6 2 25 3.0 3.4
26.2.6 2 26 3.0 4.1
27.2.6 2 27 3.0 4.2
28.2.6 2 28 3.0 4.0
29.2.6 2 29 3.0 3.1
30.2.6 2 30 3.0 3.8
31.2.6 2 31 3.0 2.4
32.2.6 2 32 3.0 2.3
33.2.6 2 33 3.0 3.6
有两组,每组有六个时间点。我想创建一个名为" st"的新变量,它包含"测量"变量归一化基于所有测量,具有相同的变量值,用于" group"和"时间"。我试过了"如果"和" if else"在R中,但似乎都不起作用。
这是我的代码:
attach(zerbedata)
if (group=='1'){
if (time==0){
zerbedata$st<-(subset(zerbedata,group=="1")[1:13,]$measurements-mean(subset(zerbedata,group=="1")[1:13,]$measurements))/sd(subset(zerbedata,group=="1")[1:13,]$measurements)
}
if (time==0.5){
zerbedata$st<-(subset(zerbedata,group=="1")[14:26,]$measurements-mean(subset(zerbedata,group=="1")[14:26,]$measurements))/sd(subset(zerbedata,group=="1")[14:26,]$measurements)
}
if (time==1){
zerbedata$st<-(subset(zerbedata,group=="1")[27:39,]$measurements-mean(subset(zerbedata,group=="1")[27:39,]$measurements))/sd(subset(zerbedata,group=="1")[27:39,]$measurements)
}
if(time==1.5){
zerbedata$st<-(subset(zerbedata,group=="1")[40:52,]$measurements-mean(subset(zerbedata,group=="1")[40:52,]$measurements))/sd(subset(zerbedata,group=="1")[40:52,]$measurements)
}
if(time==2){
zerbedata$st<-(subset(zerbedata,group=="1")[53:65,]$measurements-mean(subset(zerbedata,group=="1")[53:65,]$measurements))/sd(subset(zerbedata,group=="1")[53:65,]$measurements)
}
if(time==3){
zerbedata$st<-(subset(zerbedata,group=="1")[66:78,]$measurements-mean(subset(zerbedata,group=="1")[66:78,]$measurements))/sd(subset(zerbedata,group=="1")[66:78,]$measurements)
}
}
if (group=='2'){
if (time==0){
zerbedata$st<-(subset(zerbedata,group=="2")[1:20,]$measurements-mean(subset(zerbedata,group=="2")[1:13,]$measurements))/sd(subset(zerbedata,group=="2")[1:13,]$measurements)
}
if (time==0.5){
zerbedata$st<-(subset(zerbedata,group=="2")[21:40,]$measurements-mean(subset(zerbedata,group=="2")[14:26,]$measurements))/sd(subset(zerbedata,group=="2")[14:26,]$measurements)
}
if (time==1){
zerbedata$st<-(subset(zerbedata,group=="2")[41:60,]$measurements-mean(subset(zerbedata,group=="2")[27:39,]$measurements))/sd(subset(zerbedata,group=="2")[27:39,]$measurements)
}
if(time==1.5){
zerbedata$st<-(subset(zerbedata,group=="2")[61:80,]$measurements-mean(subset(zerbedata,group=="2")[40:52,]$measurements))/sd(subset(zerbedata,group=="2")[40:52,]$measurements)
}
if(time==2){
zerbedata$st<-(subset(zerbedata,group=="2")[81:100,]$measurements-mean(subset(zerbedata,group=="2")[53:65,]$measurements))/sd(subset(zerbedata,group=="2")[53:65,]$measurements)
}
if(time==3){
zerbedata$st<-(subset(zerbedata,group=="2")[101:120,]$measurements-mean(subset(zerbedata,group=="2")[66:78,]$measurements))/sd(subset(zerbedata,group=="2")[66:78,]$measurements)
}
}
我可以使用所有&#34; if&#34;没有任何&#34;否则&#34;声明?
答案 0 :(得分:5)
您似乎正在尝试创建一个新列CreateDC
,其中包含st
变量的规范化版本。要进行标准化,您需要减去measurements
特定均值并除以(group, time)
特定标准差。
您可以使用(group, time)
函数在一行代码中执行此操作 - 第一个参数是要处理的数据(您的ave
变量),第二个参数是如何对数据(由measurements
和group
分组),最后一个参数是一个应用于特定于组的数据的函数(您的规范化函数):
time
与手动处理每个zerbedata$st <- ave(zerbedata$measurements, paste(zerbedata$group, zerbedata$time),
FUN=function(x) (x - mean(x)) / sd(x))
zerbedata
# group id time measurements st
# 1.1.1 1 1 0.0 4.3 0.47345354
# 2.1.1 1 2 0.0 3.7 -0.89430113
# 3.1.1 1 3 0.0 4.0 -0.21042380
# 4.1.1 1 4 0.0 3.6 -1.12226024
# 5.1.1 1 5 0.0 4.1 0.01753532
# 6.1.1 1 6 0.0 3.8 -0.66634202
# 7.1.1 1 7 0.0 3.8 -0.66634202
# 8.1.1 1 8 0.0 4.4 0.70141265
# 9.1.1 1 9 0.0 5.0 2.06916732
# 10.1.1 1 10 0.0 3.7 -0.89430113
# 11.1.1 1 11 0.0 3.7 -0.89430113
# 12.1.1 1 12 0.0 4.4 0.70141265
# 13.1.1 1 13 0.0 4.7 1.38528998
# 14.2.1 2 14 0.0 4.3 -0.28630174
# 15.2.1 2 15 0.0 5.0 0.58505137
# ...
配对相比,不仅打字更少(并且更不容易出现错字),而且还具有扩展到具有不同(group, time)
组的数据集的优势。 group
变量。
答案 1 :(得分:2)
R支持,if,elseif和其他关键词。但如果你愿意,你只能使用&#39; if&#39;保护每件事。但我认为这是编程中的坏习惯。所以,使用......
if ( test_expression1) {
statement1
} else if ( test_expression2) {
statement2
} else if ( test_expression3) {
statement3
} else
statement4
这应该是有效的。如果它不起作用。请正确检查您的数据过滤。 更多细节:http://www.programiz.com/r-programming/if-else-statement
答案 2 :(得分:0)
library(dplyr)
zerbedata %>%
group_by(group, time) %>%
summarize(st = scale(measurements) )