如何使用if功能基于两个分组条件

Chu*_*ing 1 if-statement r

我的数据如下:

> 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
Run Code Online (Sandbox Code Playgroud)

有两组,每组有六个时间点.我想创建一个名为"st"的新变量,它包含基于所有测量标准化的"测量"变量,其中"group"和"time"的变量值相同.我在R中尝试过"if"和"if else",但似乎都没有效果.

这是我的代码:

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)
        }
}
Run Code Online (Sandbox Code Playgroud)

没有任何"其他"声明,我可以使用所有"if"吗?

jos*_*ber 5

您似乎正在尝试创建一个新列st,其中包含measurements变量的规范化版本.要标准化,您要减去(group, time)特定平均值并除以(group, time)特定标准偏差.

您可以在使用的一行代码做这个ave功能-第一个参数是要处理的数据(你的measurements变量),第二个参数是如何分组数据(你组由两个grouptime最后一个参数),是要应用于特定于组的数据的函数(您的规范化函数):

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
# ...
Run Code Online (Sandbox Code Playgroud)

与手动处理每个(group, time)配对相比,这不仅更少打字(并且更不容易出现错字),而且还具有扩展到具有不同组grouptime变量的数据集的优点.