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

时间:2015-10-04 02:22:26

标签: r if-statement

我的数据如下:

> 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;声明?

3 个答案:

答案 0 :(得分:5)

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

您可以使用(group, time)函数在一行代码中执行此操作 - 第一个参数是要处理的数据(您的ave变量),第二个参数是如何对数据(由measurementsgroup分组),最后一个参数是一个应用于特定于组的数据的函数(您的规范化函数):

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) )